Swift初心者のOptional型備忘録
はじめに
カシオでアプリ開発に携わっている加藤田です。
新しくiOSアプリの開発に携わるようになり、Swiftを使い始めましたが、馴染みがない"?", "!"に苦しめられました。
本記事ではSwift初心者の私が苦しめられたポイントを、備忘録としてまとめました。
この"?", "!"の正体はOptional型で、以下のメリットがある反面多くの初心者を苦しめています。
コーディングの中で明示的にnilの可能性をハンドリングできる
もしnilの可能性があればコンパイルが通らないので、言語仕様の段階で安全性が保証されている
Optional型とは
Optional型とはnilを代入できるデータ型の事です。
Optional型の宣言
Optional型は以下のように宣言します。
var hoge: Int?
var fuga: String!
※宣言時の"?"と"!"で意味は変わりますが、宣言時に"!"を使うことは少ないので本記事は"?"を使う時について記載します。
Optional型の代入
var hoge: Int?
hoge = nil // nilの代入OK
hoge = 0 // 値の代入もOK
var fuga: Int
fuga = nil // これはエラー
Optional型のアンラップ
Optional型はそのまま取り出しても、Optional型として取り出されます。
var hoge: Int?
hoge = 0
println(hoge)
// => Optional(0)
値を取り出すにはアンラップという操作が必要になります。
以下にアンラップの方法をいくつか示します。
強制アンラップ
var optionalValue: Int?
let unwrappedValue = optionalValue! // nilの時はエラーになる
if-let でアンラップ
var optionalValue: Int?
if let unwrappedValue = optionalValue {
// unwrappedValueを使用する処理
} else {
// optionalValueがnilの場合の処理
}
guard-let でアンラップ
var optionalValue: Int?
guard let unwrappedValue = optionalValue else { return }
??演算子でアンラップ (nilであった場合のデフォルト値を設定)
var optionalValue: Int?
let unwrappedValue = optionalValue ?? 0
nilのときの動作が分かりやすいので、私はこれを使うことが多いです。
?で強制的にアンラップ
// 変数str1が「nil」でない場合
var str1: String? = "HELLO"
let str2 = str1?.lowercased()
print(str2)
// => Optional("hello")
// 変数str1が「nil」である場合
var str1: String? = nil
let str2 = str1?.lowercased()
print(str2)
// => nil
Optional Chaining
Optional ChainingはOptional型変数のメンバやメソッドを呼ぶ時に使います。
※私はこのOptional Chainingについて理解ができておらず、すごく苦しみました。
var person: Person?
person = nil
print(petson?.name)
// => nil
person = Person()
person.name = taro
print(petson?.name)
// => "Optional(taro)"
終わりに
Optional型は慣れるまで少し苦しみましたが、Optional型があれば意図しないnilアクセスを減らせるので上手く使いこなしていきたいですね。
参考サイト
Swiftのオプショナル型について
どこよりも分かりやすいSwiftの"?"と"!"