前を向くために Part3

プログラミング、音楽、外交問題、その他思いついたことを何でも公開

人生、前向きに生きたいもの。でも、何かと後ろ向きになりがちな自分がいるのです。前向きに生きるには、まず前を向かなければなりませぬ。じゃあ前を向くためにはどうしたらいいの?と日々悩んどります。これはその記録の一部です。

Swift言語ガイド第2章基本演算子

第1章に続けて第2章も要約。C と同じところはバッサリ省略している。Swift やろうという人なら C は知っているだろうということで。

用語 Terminology

演算子は単項演算子か、2項演算子か、3項演算子である。

  • 単項演算子は一つのターゲットに作用する(-a とか)。単項前置演算子はターゲットの直前に現れ(!a とか)、単項後置演算子はターゲットの直後に現れる(i++ とか)。
  • 2項演算子は二つのターゲットに作用する(2 + 3 とか)。二つのターゲットの間に現れるので、これは中置である。
  • 3項演算子は三つのターゲットに作用する(a ? b : c)。C と同様、3項演算子は一つだけである。

演算子が作用する値はオペランドと言う。

代入演算子

タプルにも使える。C や Objective-C と違って、代入演算子それ自身は値を返さない(if x = y は誤り)。この特徴は代入演算子=)を等値演算子==)が意図されるところに間違って使われるのを予防する。


let b = 10
var a = 5
a = b
let ( x, y ) = ( 1, 2 )

算術演算子

以下の4つはすべての数値型をサポートする。

  • 加算(+
  • 減算(-
  • 乗算(*
  • 除算(/

C や Objective-C と違って、Swift のデフォルトでは算術演算子での値のオーバーフローを許さない。オーバーフローを許す場合はオーバーフロー演算子a &+ b とか)を使う必要がある。これについては詳しくは後述。

加算演算子は文字列の結合にも使える。

剰余演算子

  • % を使う(9 % 4 とか)。
  • a = ( b × 倍数 ) + reminder
  • a が負の場合は倍数も reminder も負になる。
  • b が負の場合は正と同様に扱われる(a % ba % -b も答えは一緒)。
  • 浮動小数点にも使える(8 % 2.50.5 になるとか)。

インクリメント演算子とデクリメント演算子

  • C と同様、インクリメント演算子++)とデクリメント演算子--)がある。
  • どの整数型あるいは浮動小数点型にも使える。
  • 値を返す。
  • 前置演算子としても後置演算子としても使える。単に値を1だけ増やすあるいは減らすという意味ではどちらも同じ結果になるが、値を返す点に注目すると、前置演算子の場合には、値を返す前にインクリメントあるいはデクリメントされる。後置演算子の場合には、値を返した後にインクリメントあるいはデクリメントされる。
  • 特段の理由がない限り、常に前置演算子を使うことをアップルは推奨している。


var a = 0
let b = ++a // a も b も 1
let c = a++ // a は 2、c は 1

単項プラス演算子、単項マイナス演算子

期待通りに働く。リテラルだけでなく定数や変数にも使える。空白文字を挟んではならない。

複合代入演算子

+= とか -= のこと。C と同じだが、値は返さないので注意。インクリメント・デクリメント演算子と混同しないように。

比較演算子

  • 等しい(a == b
  • 等しくない( a != b
  • 大きい(a > b
  • 小さい(a < b
  • 大きいか等しい(a >= b
  • 小さいか等しい(a <= b

上記に加えて、Swift では2つのアイデンティティ演算子===!==)を提供する。これらは2つのオブジェクトの参照が同じオブジェクトインスタンスを参照しているかどうかをテストする演算子である。詳細は「クラスと構造体」のところで述べる。

それぞれの比較演算子は、みんな Bool 値を返す。

3項条件演算子

C と同じ。使いすぎに注意。

nil 結合演算子 Nil Coalescing Operator

  • a ?? b と書く。
  • a は常に Optional 型である。
  • b の型は a に保存されている型と一致しなければならない。
  • Optional a が値を持つならばその値を返し、anil ならばデフォルト値b を返す。
  • 次の3項条件演算式と等価。a != nil ? a! : b

範囲(レンジ)演算子

  • 閉じた範囲演算子 a...ba から b までの範囲を定義する。ab より大きくてはならない。
  • 半開き範囲演算子 a..<ba から b までの範囲を定義するが、b は含まない。閉じた範囲演算子と同じく ab より大きくてはならない。
  • for 文の範囲指定などに使うと便利。
  • for index in 1...5 {
    	println( index )
    }
    
    let names = [ "あんな", "あきら", "ブン", "ジョー" ]
    let count = names.count
    for i in 0..< count {
    	println ( names[ i ] )
    }
    

    論理演算子

    C と同様、以下の3つがある。

    論理否定は前置演算子なので間に空白文字があってはならないことに注意

    論理演算子の合成

    複数の論理演算子が連なっている時のこと。優先順位は C と同じ。かっこが優先されるのも同じ。読みやすいようにかっこを入れようというアップルの主張もある。

    (第2章基本演算子終わり)