Swift の演算子

代入演算子(Assignment Operator)

いわゆる代入 a=b で、aにbを代入することができる。

タプルを使うことで一度に複数の値を代入できる。

let (x,y) = (1,2)

算術演算子(Arithmetic Operators)

Operator Description
+ 加算
- 減算
* 乗算
/ 除算
% 剰余

単項演算子

変数・定数に+ or - をつけることで、

+x, -x
(+1)*x, (-1)*x

と同じ結果が得られる。+の演算の場合何もしないのと同じ

複合代入演算子(Compund Assignment Operators)

演算子と代入をシンプルにした書き方。

=の前に演算子を記載する。

a+=1は、 a=a+1と同じ。

+は、文字列も結合可能

Operator Description
*= 乗算と代入
/= 除算代入
%= 剰余と代入
+= 加算と代入
-= 減算と代入
<<= 左ビットシフトと代入
>>= 右ビットシフトと代入
&= ビット単位の AND と代入
` =`
^= ビット単位の XOR と代入
&*= オーバーフローの乗算と代入
&+= オーバーフローの乗算と代入
&-= オーバーフローの減算と代入
&<<= オーバーフローを無視した左ビットシフトと代入
&>>= オーバフローを無視した右ビットシフトと代入
.&= ポイント単位ビット単位のANDと代入
`. =`
.^= ポイント単位ビット単位のXORと代入

比較演算子(Comparison Operators)

Operator Description
== 等しい
!= 等しくない
> より大きい
< より小さい
>= 以上
<= 以下

tuppleでも比較可能。

(1, "red") < (2, "blue")        // 一つ目を評価して trueになるので、二つ目は無視 
(1, "red") < (1, "bird")        // 一つ目は同じなので、二つ目を評価し false となる
(1, "red") == (1, "red")      // 一つ目、二つ目共に等しいので trueとなる

三項演算子(Ternary Conditional Operator)

  if a>b { 
    print("big")
  } else {
    print("small")
  }

というのを print(a>b ? "big" : "small" というふうにシンプルにかける。

nil合体演算子(nil-Coalescing Operator)

変数が空かどうか判定して、初期値設定するときによく使う。

例:testがnilの場合に ?? 以降が評価される

    var test:String?
    
    test = test ?? "デフォルト"

範囲演算子(Range Operators)

for 文でloopさせる範囲を指定するとき等に使う。

閉範囲演算子(Closed Range Operator)

開始と終了を指定する

  for index in 1...5 {
      print("\(index)")
  }

半開範囲演算子(Half-Open Range Operator)

開始と終了を指定するのは変わらないが、終了値を含まない

var ar = [5,1,2,4,-1]

for index in  0..<ar.count {
    print("\(ar[index])")
}


片側範囲演算子(One-Sided Ranges)

開始もしくは、終了を指定しないやり方。

index値以降最後まで

var ar = [5,1,2,4,-1]

for index in  1... {
    print("\(ar[index])")
}

最初からindex値まで

var ar = [5,1,2,4,-1]

for index in  ...3 {
    print("\(ar[index])")
}

最初からindex値より小さい値まで

var ar = [5,1,2,4,-1]

for index in  ..<3 {
    print("\(ar[index])")
}

論理演算子(Logical Operators)

Operator Description
&& 論理積
|| 論理和
! 否定

ビット演算子(Bitwise Operators)

Operator Description
~ 否定。全bitを0/1反転させる。変数の前につける
& bitの論理積
| bitの論理和
^ bitの排他的論理和

ビット左右シフト演算子(Bitwise Left and Right Shift Operators)

a<<2 で2bit 左シフト、 a>>2 で2bit 右シフトになるが、SignedかUnsignedかで、挙動が変わる。Signedの場合は、単純にシフトするだけだが、Unsigned の場合は、最上位のSign bitを除いてシフトする。右シフトしたときは、ずらした上位ビットにSign bit と同じ値で埋める。

オーバフロー演算子(Overflow Operators)

変数の型の最大値を超えると通常オーバフローエラーとなるが、エラーにしないために使用する。

Operator Description
&+ オーバフロー加算
&- オーバフロー減算
&* オーバフロー積算
   var UInt8 a = 255

   a = a + 1 // オーバーフローエラー

   a = a &+ 1 //オーバーフローとならずにはみ出たビットは破棄される。この場合は、0 となる。

優先順位と結合規則(Precedence and Associativity)

大雑把で、下記のようになるが、細かく優先順位が決められているようだ。こちらが詳しい。

bit演算>乗除余算>比較演算>代入

カスタム演算子

演算子をオーバーロードによりカスタマイズすることができる。

    struct customS {
        var x = 0.0
        var s = "ab"
    }
    
    extension customS {
        static func + (first: customS, second: customS) -> customS {
            return customS(x: first.x + first.x, s:first.s + second.s)
        }
    }

    var c1 = customS(1.0, "abcde");
    var c2 = customS(2.0, "fghi");
    var c3  = c1+c2;  // c3 は、c3.x = 3.0, c3.s = "abcdefghi" となる


External Link