Swiftのオプショナル型は簡潔に書きやすいが、短縮された記号は慣れるまで理解しにくいと感じた。そのため、Swiftの記法についてまとめようと思う!
今回は、?・!あたりがややこしく感じたのでその辺をまとめることにする。as?・as!は(2)でまとめる。
オプショナルとは?
そもそもオプショナルとは? オプショナルとは変数の中にnilの代入を許可している型である。Swiftでは変数の中身がnilであることを基本的に許可していないが、 Optional<String>
のような型にすることでnilが代入できるようになる。
なぜオプショナルを使うのか?
なぜオプショナル型を使う必要があるかと言うと、使い手(クライアント)が変数を呼び出した際にnilであることに気づかずに操作しようとするとnullpointerexception
と言うエラーになり落ちるためである。
オプショナルの扱い方
?
swiftのOptinal型は先ほども触れたが、Optional<String>
のような型になっている。それを省略形で書いたのが、?
である。
// swiftはnilを許さないのでこの場合はエラーになる
var middleName: String
// この場合は初期化されているので大丈夫
var middleName: String = "middle"
// 下記の意味は同じくオプショナル型になる
var middleName: Optional<String>
var middleName: String?
また、?
にはオプショナルの他にもう一つの概念があり、それが三項演算子である。三項演算子はif文を省略した形式である。下の例はオプショナルと三項演算子の?
が合わさって判定されているパターンだ。
// 下記の例だとisHumanがtrueなら人間、falseならその他が表示される
var isHuman: Bool = true
print(isHuman ? "人間": "その他")
// 三項演算子とオプショナルの?の合わせ技
var monthlyIncomeA: Int? = 200000
print(monthlyIncome ?? "あなたはニートです。") //200000
var monthlyIncomeB: Int? = 200000
print(monthlyIncomeB ?? "あなたはニートです。") //あなたはニートです。
!
unwrap
オプショナル型は呼び出す時にはそのまま使うことができないので、利用するためにunwrap
する必要がある。unwrapはOptional<String> → String
のようなイメージ。
普通にunwrapして使うには下記の2通りがある。
let middleName: String? = nil
// unwrap1
// middleNameがnilじゃないかをifで判定し、値がある場合のみprintする
if middleName != nil {
print(middleName)
}
// unwrap2 (Optional Binding)
// middleNameの値をvalue詰め、値がある場合のみ{}にvalueを渡してprintする
if let value = middleName {
print(value)
}
暗黙的unwrap
Optionalは毎回unwrapしなければならないため、コーディングが長くなってしまうと言うデメリットがある。そのため、暗黙的unwrapを使えば一度値がセットされたら、以降nilになることはないと言う前提でunwrapしなくてよくなる。
暗黙的unwrapした後にnilが入ってしまうとアプリがクラッシュするので使うときは要注意!
// 宣言時に!をつけると以降unwrapをしなくてよくなる。
var income: Int!
income = 2500000
print(income) //2500000 !をつけずにprintすることができる
// 暗黙的unwrapした値にnilが入ると。。
income = nil
print(income) // クラッシュするので要注意!!
まとめ
今回はオプショナルの省略記号についてまとめてみた。オプショナルやunwrapの概念について理解する時に参考にしてもらえればと。型キャストや引数の省略などの書き方もswiftは独特な印象だったので、(2)以降でその辺りも触れていきたいと思う!