Swift/Operator
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" となる