はじめに
swiftのoptional型の基礎について学んだので,簡単にメモしました.
1. Force Unwrapping (optional!)
強制的にunwrapしてoptional型からvalueを取り出す.nilが絶対入らない場合に利用.
let myOptional: String?
myOptional = "hello"
let text: String = myOptional!
ただし,仮にnilが入ってしまってエラーになった時,複数のコードやファイルが存在した場合,その原因を見つけるのが大変になり,安全でない. → 2. Check for nil Valueを利用.
2. Check for Nil Value (if optional != nil {optional!})
- Force Unwrappingより安全なアンラッピング.if文でnilか否か条件分岐.
let myOptional: String?
myOptional = nil
if myOptional != nil {
let text: String = myOptional! //この部分が冗長
} else {
print("myOptional was found to be nil.")
}
ただし,nil出ない時にも!を付けないといけないのは少し冗長. → 3. Optional Bindingを利用.
3. Optional Binding(if let safeOptional = optional {safeOptional})
以下のコードを例に,myOptionalがnilでなかったら,定数safeOptionalに代入.
これにより,if文内で!をつける必要がなくなる.
let myOptional: String?
myOptional = nil
//myOptional = "hello"
if let safeOptional = myOptional {
let text: String = safeOptional
print(text)
} else {
print("myOptional was found to be nil.")
}
ただし,myOptionalがnilの時にdefault値を与えたい場合 → 4. Nil Coalescing Operatorを利用.
4. Nil Coalescing Operator(optional ?? defaultValue)
optionalがnilでない場合,その値をそのまま用いる.
optionalがnilの場合,defaultValueを用いる.
let myOptional: String?
myOptional = "good bye" // output: "good bye"
//myOptional = nil // output: "hello"
let text: String = myOptional ?? "hello"
print(text)
5. Optional Chaining(optional?.property, optional?.method())
optional型のclass or structのオブジェクトを生成した際に,Optional Chainingを利用.
optional?.property, optional?.method()で,オブジェクトがnilでない場合,property, methodにアクセスできる.
Optional Chainingなしとありの場合で比較.
Optional Chainingなしの場合(安全で無い)
オブジェクトを生成していない場合で,プロパティを取り出すために,オブジェクトをforce unwrappingするとエラー → 安全で無い
struct MyOptional {
var property = 123
func method() {
print("I am the struct's method.")
}
}
let myOptional: MyOptional? //optional型のstructのオブジェクトを定義
myOptional = nil // output: error
//myOptional = MyOptional() // output: 123
print(myOptional!.property)//optional型のオブジェクトからプロパティを取り出すためには,オブジェクトをunwrapする必要あり
Optional Chainingありの場合(安全)
optional?.property, optional?.method()で,オブジェクトがnilでない場合,property, methodにアクセスできる.
struct MyOptional {
var property = 123
func method() {
print("I am the struct's method.")
}
}
let myOptional: MyOptional? //optional型のstructのオブジェクトを定義
myOptional = nil // output: nil
//myOptional = MyOptional() // output: Optional(123)
print(myOptional?.property)// methodも同様のやり方
まとめ
optional型の理解がかなり深まりました. どんどん活用していきたいですね.