しめ鯖日記

swift, iPhoneアプリ開発, ruby on rails等のTipsや入門記事書いてます

Swiftのはてな記号とびっくりまーく記号についての調査

Swiftはてな記号とびっくりまーく記号について調べてみました。

SwiftのOptional型について

上の記号はOptional型という物に深く関連しています。
Optional型とはnilを許可する型の事です。
分かりやすく言うとはてなが付いているものはOptional型、ついてない場合は非Optional型です。

let a: Int? // これはOptional型
let b: Int // これは非Optional型

実際に下のように非Optional型にnilを入れようとするとエラーになります。

let a: Int? = nil // これは大丈夫
let b: Int = nil // これはエラーになる

変数についているびっくりまーくは何か?

これはアンラップと言って、Optional型を非Optional型にしています。
通常は非Optional型にOptional型の値を代入する事はできません。
しかしOptional型の変数でもビックリマークを付ける事で非Optional型へ代入ができるようになります。

let a: Int? = 1
let b: Int = a // これはエラー
let c: Int = a! // これは大丈夫

逆は問題なく動きます。

let a: Int = 1
let b: Int? = a // これは大丈夫

代入だけでなく、メソッドの引数も同様です。

func b(value: Int) {
    print(value)
}

let a: Int? = 1
b(a!) // ビックリマークを付ける事で代入可能

変数に付いているはてなマーク

はてなマークは、Optional型の変数のメソッドを呼び出す時に使います。
Optional型の変数のメソッドを呼び出す際は ! か ? が必須になります。

?を付けた場合は変数がnilの場合に返り値がnilになり、!を付けた場合は変数がnilの時にエラーになります。

class A {
  func method() -> String {
    return "AA"
  }
}
let a: A? = A()
a.method() // これはエラー、!か?を付ける必要がある
a!.method() // これは大丈夫、ただしaがnilの時にエラーになる
a?.method() // これも大丈夫、aがnilの時は戻り値がnilになる

まとめ

Optional型は最初は法則が掴めずに悩むのですが、一度覚えると非常に簡単でした。