0
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 3 years have passed since last update.

Optionalについてまとめてみた

Last updated at Posted at 2020-08-25

何を表しているのか?

Optional<Wrapped>型は、値があるか空かのいずれかを表した型です。

何がうれしいのか?

Optional型にしてできることはnilを扱えるようになることです。 

→nilについての処理を楽にできる。

Optionalの中身

enum Optional<Wrapped> {
    case none
    case some(Wrappped)
}

.noneが値の不在、すなわちnilと等しいケースで、

.someがWrapped型の値の存在を表すケースです。

let none = Optional<Int>.none
print(".none: \(String(describing: none))")

let some = Optional<Int>.some(1)
print(".none: \(String(describing: some))")

/*
.none: nil
.some: Optional(1)
*/

このことより、Optional型の.noneとnilリテラルが対応づけられていることがわかる。

定義方法

変数名:型名?

めっちゃ簡単やん!!

めんどいのはここから

let a:Int = 1
let b:Int? = 2
let c = a + b //コンパイルエラー

何故コンパイルエラーとなるのか 

→Optional型はnilを扱う都合上そのままでは値が取り出せない仕様になっています。

つまり、型をOptional型で包んでいる感じです。 

イメージとしては、Optionalという袋の中に型という食べ物が入っており、袋に入ったままだと、四則演算という料理に使えないと考えてください。

https://d2l930y2yx77uc.cloudfront.net/production/uploads/images/16714383/picture_pc_8961d75225778049011cca86046f14ad.png

取り出したい!!

ForcedUnwrapping

!演算子によるOptional型の値の取り出し

!をつけることにより強制的にOptionalの殻を外すことができます

let a : Int? = 0
let b = a!
print(b) //0

メリット

・楽にunwrapできる。

デメリット

この方法では変数にnilが入っているかわからないため、安易にnilを代入してしまい、アプリのクラッシュに繋がるという最悪のことを避けるためになるべく使わないでおきましょう

オプショナルバインディング

if文による値の取り出し

条件分岐文や繰り返し文の条件にOptional型の値を渡し、値の有無に応じて処理を切替え、値が存在する場合はWrapped型の取り出す方法です。

let optionalA = Optional("a")

if let a = optionalA {
    print(type(of: a))
}

//String

??演算子

値が存在しない場合のデフォルト値を指定する演算子

Optional型に値が存在しない場合のデフォルト値を指定するには、中間演算子の??を使用します。

let optionalInt : Int? = 1
let int = optionalInt ?? 3
print(int) //1
let optionalInt2 : Int? = nil
let int2 = optionalInt2 ?? 3
print(int2) //3
0
1
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
0
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?