SwiftとObjective-Cとの大きな差の一つは?
Optionalです。
Optionalを理解しましょう。
SwiftのOptionalとは
'nilを扱うことができるタイプ'と言う意味です。
逆に言うとOptionalではない一般変数(Variables)/常數(Constants)にはnilを入れ代入することは出来ないです。
これを利用すればSwiftの基本タイプ(Bool, Int, Floatなど)にもnilを使用できます。
Optionalの宣言
var optionalValue1: Bool? = nil
var optionalValue2: Optional<Int>
var optionalValue3: Int?
var optionalValue4: String!
var optionalValue5: [String: Any]?
**特に初期化宣言がない場合nilが基本的に代入される**
例)
var optionalValue: Int?
print(optionalValue)
optionalValue = 5
print(optionalValue)
result:
nil
optional(5)
Implicitly Unwrapped Optional
上の宣言を見るとoptionalValue4は'?'ではなく'!'で初期化された。
これをImplicitly Unwrapped Optionalと言う。nilで初期化されたのは同じだが少し差はある。
上のイメージのように!(暗視的Optional)で初期化された変数はコンパイラーからWarningが出ないのが確認できる。これは初期化視点では明確なデータが代入することはできないが以降使用されるときには必ず代入されるのを保証するとき使用する。もしnilが代入されたらランタイム中クラッシュするので注意が必要だ。
Optional使用
Optionalはnilが含まれる場合があると言うことでランタイム中nilかどうか確認する必要がある。
nil確認(if, guard)
var optionalValue: String?
if optionalValue != nil {
print("optinalValueの値 = \(optionalValue)")
} else {
print("optinalValueの値 = nil")
}
または
guard optionalValue != nil else {
print("optinalValueの値 = nil")
return
}
print("optinalValueの値 = \(optionalValue)")
Optional binding
if let nonOptionalStr = optionalValue {
print(nonOptionalStr)
} else {
print("nil")
}
Optional Chaining
var optionalValue1: String? = "efg"
var optionalValue2: String? = "123"
let str1 = optionalValue1?.uppercased()
let str2 = optionalValue2?.uppercased()
print(str1)
print(str2)
result:
Optional("EFG")
Optional("123")