LoginSignup
27
26

More than 5 years have passed since last update.

optional型についてまとめ

Last updated at Posted at 2015-10-18

Swiftを某社で勉強し始めて、1週間が経ちました。
Qiitaにあるswift関連の記事は初学者には優しくないなと思い、初学者でもわかるような記事を更新していきたいと思います。

Optional型とは?

  • Appleの「安全のための設計」の一つ
  • 変数の中身やメソッドの返り値が nil になる可能性をプログラムで明示することを可能になり、プログラマがその扱いを間違えた時にコンパイラが警告やエラーを出すことができる

nilの使われ方まとめ

  • メソッドの返り値として、処理に成功すれば期待される値、失敗すればnilを返す。
  • メソッドの引数として指定したい場合は指定したい値、省略したい場合はnilを渡す
  • オブジェクトのプロパティの初期化前の値としてnilを持つ。

Swiftでは、 String型、Int型などの型を持つ変数にnilを格納することができない設計になっている
--> 変数やメソッドの返り値がString型である限り、その内容がnilである事はないことを保証している(逆にnilだとコンパイルエラーが生じる)
--> Optional型はString型やInt型と同じく一つの型ですが、 「nilまたは何らかの値を格納する」 という点で特殊な型だと言える。

Optional型の宣言と初期化

optional型の宣言.
var optionalString: Optional<String>
optional型の宣言と値の格納.
var optionalString: Optional<String>
optionalstring = "Hello, Swift"
// {Some "Hello, Swift"}
optionalstring = nil
optional型の宣言と初期化.
var optionalInt: Optional<Int> = 4

Optional型のアンラップ

Optional型に格納した値は アンラップ することで元の型のメソッドを使用できるようになる。
これは、元の型をOptional型で ラップしていたものを アンラップして元の型に戻す、という意味合いが含まれている。
Optional型のアンラップには以下の4つの方法がある

  1. Forced Unwrapping
  2. Optional Binding
  3. Optional Chaining
  4. Implicitly Unwrapped Optional


Forced Unwrapping


Optional型の値や変数は後ろに「!」記号をつけることでアンラップして元の型に戻すことができる。

注意点:
変数や値がnilである場合、返される値の使い方によっては実行時にランタイムエラーとなりアプリは強制終了してしまう

いつ使う?
中身がnilでないことがわかっている場合もしくはnilでないことを確認した上で使用する

Forced_Unwrappingの例.
var optionalString: Optional<String> = "Hello, Swift"

//アンラップして変数に代入
var unwrappedString: String = optionalString!
unwrappedString.lowercaseString //"hello,swift"

//アンラップしてそのまま使用
optionalString!.lowercaseString //"hello, swift"
nilかどうかの確認.
if optionalString != nil {
    optionalString!.lowercaseString
}


Optional Binding


中身がnilでないかの確認とアンラップを同時に行う構文。

いつ使う?
中身がnilであるか否かによらず使える

Optional_Bindingの例.
var optionalString: Optional<String> = "Hello, Swift"
if let unwrappedString = optionalString {
    unwrappedString.lowercaseString
    //"hello, swift"
}


Optional Chaining


Optional型の変数を元の型に戻さず、元の型のメソッドを使用することを目的。

いつ使う?
中身がnilでないことがわかっている場合もしくはnilでないことを確認した上で使用する

Optional_Chainingの例.
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でないことが宣言時に確定する場合にのみ使用することを推奨

ImplicitlyUnwrappedOptional型の宣言と初期化.
var optionalString: ImplicitlyUnwrappedOptional<String> = "Hello,Swift"
optionalString.lowercaseString
//"hello,swift"

Optional型の省略形

2つのOptional型の省略形.
var optionalString: String? = "Hello, Swift"
var optionalInt: Int! = nil

前半は、Optional型の宣言時の省略形
後半は、ImplicitlyUnwrappedOptional型の省略形

注意点
省略形の「!」や「?」記号はOptional Chainingで使用する「?」記号やForced Unwrappingで使用する「!」記号とは意味合いが異なる。

27
26
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
27
26