Swift/Operator: Difference between revisions
		
		
		
		Jump to navigation
		Jump to search
		
| imported>Fire No edit summary | 
| (No difference) | 
Latest revision as of 11:54, 15 November 2022
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" となる