Posted at

【Swift】オプショナル型の使い方


オプショナル型とは?

オプショナル型はSwiftの特徴の一つであり、値がnilの可能性がある時に用いられる型です。

このオプショナル型はその値がnilである可能性を示してくれるため非常に便利な型なのですが、扱い方を間違えるとコンパイルエラーになったりバグの要因になります。

今回はそんなオプショナル型の使い方について考えていきます。


Optional < Wrapped >型を用いる時

まず下記のコードを見てください。このコードはRPGに出てくる武器の構造体です。定数として名前(name)、攻撃力(offensivePower)、追加効果(additionalEffect)が定義されています。

ここで注目すべき点はadditionalEffectのかたがString?となっている点です。この?がオプショナル型を表していて、この定数がnilの可能性があることを示しています。

このように値が定かではない値にはオプショナル型を定義していきましょう。

struct Weapon {

let name: String
let offensivePower: Int
let additionalEffect: String?
}


暗黙的にアンラップされたOptional型

下記のコードを見ると変数の定義時に!を指定することでアンラップが暗黙的に行われています。

しかし初期化されていない値に対してアクセスしたため実行時エラーになっています。

このように暗黙的なアンラップは危険な面があります。しかし、初期化時に値が決まっていなくても、初期化以降に必ず値が設定される場合は用いたほうが、可読性も上がり効率的です。

class Sample {

var value: String!
}

let sample = Sample()
sample.value //実行時エラー

以下が利用した方が良い例です。

このコードはStoryboard上に配置した要素から自動的に生成されるコードで、Storyboard上の要素と@IBOutlet属性とともに宣言されたプロパティと紐づけています。

このsomeLabelプロパティはインスタンス化される際には空ですが、その後にStoryboardから生成された値が設定されるので、暗黙的にアンラップして大丈夫です。

もしここでアンラップしなければオプショナルバインディングを別で行わなければならないため、そちらはコードを冗長にしないためにも止めておきましょう。

@IBOutlet weak var someLabel: UILabel!