Optional型がよくわからなかったのでまとめておく.
定義のメモだけなので,使い方とかもそのうち追記していきたい.
Optional型とは?
nil を許す型のこと.
宣言
型に?
を付加すると,Optional型を宣言できる.
ちなみにT?
はOptional<T>
のシンタックスシュガー.
1
2
3
| var optionalSuger: Int? // Optional型の宣言.初期値はnil.
var optional: Optional<Int> // Int? と同じ意味
var notOptional: Int // 非Optional型.初期値は空(nilですらない)
|
wrap と unwrap
T
とT?
は違う型.
同様に扱うためにはunwrapする必要がある.
unwrapの方法には以下の4種類がある.
- Forced unwrapping
- Optional Chaining
- Optional Binding
- 比較演算子
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
| ////////////////////////////////////////////
// Optional型の宣言
class Dog {
func bark() -> String {
return "BowWow!"
}
}
var wrappedDog: Dog? = Dog()
////////////////////////////////////////////
// 1. Forced Unwrapping
// 「!」を付加する.
// 値が nil だった場合はランタイムエラー.
println(wrappedDog!.bark) // "BowWow!"
////////////////////////////////////////////
// 2. Optional Chaining
// 「?」を付加する
// 値が nil だった場合は nil を返す.
// 最終的な戻り値は Optional型 となる.
println(wrappedDog?.bark()) // Optional("BowWow!")
////////////////////////////////////////////
// 3. Optional Binding
// if,while 等の条件式内で宣言,代入されると unwrap される.
// 値が nil の場合は条件式が false となる.
if var unwrappedDog = wrappedDog {
println(unwrappedDog.bark()) // "BowWow!"
}
////////////////////////////////////////////
// 4. 比較演算子
// 比較演算子を使うと unwrap される.
var wrappedInt: Int? = 1
println(wrappedInt == 1) // "true"
|
Implicitly Unwrapped Optional型とは?
型に!
を付加すると,Implicitly Unwrapped Optional型を宣言できる.
ちなみにT!
はImplicitlyUnwrappedOptional<T>
のシンタックスシュガー.
1
2
3
4
5
6
7
8
9
10
| var iuOptionalSuger: Int! // Implicitly Unwrapped Optional型の宣言.初期値はnil.
var iuOptional: ImplicitlyUnwrappedOptional<Int> // Int! と同じ意味
var Optional: Int? // Optional型
iuOptional = 1
Optional = 1
// 自動的に unwrap される.
println(iuOptional) // "1"
println(Optional) // "Optional(1)"
|
比較演算子:??
nil かどうか判定する比較演算子.
a ?? b
はa != nil ? a! : b
のシンタックスシュガー.
1
2
3
4
| var wrappedInt: Int?
ptinrln(wrappedInt ?? 2) // "2"
wrappedInt = 1
println(wrappedInt ?? 2) // "1"
|
参考サイト
Swift Optional 型についてのまとめ Ver2
SwiftのOptional型を極める