Swiftを某社で勉強し始めて、1週間が経ちました。
Qiitaにあるswift関連の記事は初学者には優しくないなと思い、初学者でもわかるような記事を更新していきたいと思います。
Optional型とは?
- Appleの「安全のための設計」の一つ
- 変数の中身やメソッドの返り値が nil になる可能性をプログラムで明示することを可能になり、プログラマがその扱いを間違えた時にコンパイラが警告やエラーを出すことができる
nilの使われ方まとめ
- メソッドの返り値として、処理に成功すれば期待される値、失敗すればnilを返す。
- メソッドの引数として指定したい場合は指定したい値、省略したい場合はnilを渡す
- オブジェクトのプロパティの初期化前の値としてnilを持つ。
Swiftでは、 String型、Int型などの型を持つ変数にnilを格納することができない設計になっている
--> 変数やメソッドの返り値がString型である限り、その内容がnilである事はないことを保証している(逆にnilだとコンパイルエラーが生じる)
--> Optional型はString型やInt型と同じく一つの型ですが、 「nilまたは何らかの値を格納する」 という点で特殊な型だと言える。
Optional型の宣言と初期化
var optionalString: Optional<String>
var optionalString: Optional<String>
optionalstring = "Hello, Swift"
// {Some "Hello, Swift"}
optionalstring = nil
var optionalInt: Optional<Int> = 4
Optional型のアンラップ
Optional型に格納した値は アンラップ することで元の型のメソッドを使用できるようになる。
これは、元の型をOptional型で ラップしていたものを アンラップして元の型に戻す、という意味合いが含まれている。
Optional型のアンラップには以下の4つの方法がある
- Forced Unwrapping
- Optional Binding
- Optional Chaining
- Implicitly Unwrapped Optional
Forced Unwrapping
Optional型の値や変数は後ろに「!」記号をつけることでアンラップして元の型に戻すことができる。
注意点:
変数や値がnilである場合、返される値の使い方によっては実行時にランタイムエラーとなりアプリは強制終了してしまう
いつ使う?
中身がnilでないことがわかっている場合もしくはnilでないことを確認した上で使用する
var optionalString: Optional<String> = "Hello, Swift"
//アンラップして変数に代入
var unwrappedString: String = optionalString!
unwrappedString.lowercaseString //"hello,swift"
//アンラップしてそのまま使用
optionalString!.lowercaseString //"hello, swift"
if optionalString != nil {
optionalString!.lowercaseString
}
Optional Binding
中身がnilでないかの確認とアンラップを同時に行う構文。
いつ使う?
中身がnilであるか否かによらず使える
var optionalString: Optional<String> = "Hello, Swift"
if let unwrappedString = optionalString {
unwrappedString.lowercaseString
//"hello, swift"
}
Optional Chaining
Optional型の変数を元の型に戻さず、元の型のメソッドを使用することを目的。
いつ使う?
中身がnilでないことがわかっている場合もしくはnilでないことを確認した上で使用する
var optionalString: Optional<String> = "Hello, Swift"
optionalString?.lowercaseString
//{Some "hello, swift"}
「?」記号をつけることで、変数をアンラップしてlowercaseStringプロパティを参照しているのだが、値や変数がnilの場合はOptional Chainingの結果はnilになってしまう。
Optional Chainingでは、 値がnilでなければ処理をし、nilならなにもしないという処理がサクッとかける。
Implicitly Unwrapped Optional
swiftにはnilと任意の型の値を格納するもう一つの型としてImplicitlyUnwrappedOptional型もある。
特徴
使用時には自動的にアンラップされる
注意点
ImplicitlyUnwrappedOptional型もその値がnilの時にアンラップしようとするとランタイムエラーとなる可能性あり
いつ使う?
ImplicitlyUnwrappedOptional型もnilでないことが宣言時に確定する場合にのみ使用することを推奨
var optionalString: ImplicitlyUnwrappedOptional<String> = "Hello,Swift"
optionalString.lowercaseString
//"hello,swift"
Optional型の省略形
var optionalString: String? = "Hello, Swift"
var optionalInt: Int! = nil
前半は、Optional型の宣言時の省略形
後半は、ImplicitlyUnwrappedOptional型の省略形
注意点
省略形の「!」や「?」記号はOptional Chainingで使用する「?」記号やForced Unwrappingで使用する「!」記号とは意味合いが異なる。