見出し画像

Swift初心者のOptional型備忘録

はじめに

カシオでアプリ開発に携わっている加藤田です。
新しくiOSアプリの開発に携わるようになり、Swiftを使い始めましたが、馴染みがない"?", "!"に苦しめられました。
本記事ではSwift初心者の私が苦しめられたポイントを、備忘録としてまとめました。

この"?", "!"の正体はOptional型で、以下のメリットがある反面多くの初心者を苦しめています。

  • コーディングの中で明示的にnilの可能性をハンドリングできる

  • もしnilの可能性があればコンパイルが通らないので、言語仕様の段階で安全性が保証されている

Optional型とは

Optional型とはnilを代入できるデータ型の事です。

Optional型の宣言

Optional型は以下のように宣言します。

var hoge: Int? 
var fuga: String!

※宣言時の"?"と"!"で意味は変わりますが、宣言時に"!"を使うことは少ないので本記事は"?"を使う時について記載します。

Optional型の代入

var hoge: Int? 
hoge = nil // nilの代入OK
hoge = 0  // 値の代入もOK

var fuga: Int
fuga = nil // これはエラー

Optional型のアンラップ

Optional型はそのまま取り出しても、Optional型として取り出されます。

var hoge: Int?
hoge = 0
println(hoge)
// => Optional(0)

値を取り出すにはアンラップという操作が必要になります。
以下にアンラップの方法をいくつか示します。

  • 強制アンラップ

var optionalValue: Int?
let unwrappedValue = optionalValue! // nilの時はエラーになる
  • if-let でアンラップ

var optionalValue: Int?
if let unwrappedValue = optionalValue {
    // unwrappedValueを使用する処理
} else {
    // optionalValueがnilの場合の処理
}
  • guard-let でアンラップ

var optionalValue: Int?
guard let unwrappedValue = optionalValue else { return }
  • ??演算子でアンラップ (nilであった場合のデフォルト値を設定)

var optionalValue: Int?
let unwrappedValue = optionalValue ?? 0

nilのときの動作が分かりやすいので、私はこれを使うことが多いです。

  • ?で強制的にアンラップ

// 変数str1が「nil」でない場合
var str1: String? = "HELLO"
let str2 = str1?.lowercased() 
print(str2) 
// => Optional("hello")

// 変数str1が「nil」である場合
var str1: String? = nil
let str2 = str1?.lowercased() 
print(str2) 
// => nil

Optional Chaining

Optional ChainingはOptional型変数のメンバやメソッドを呼ぶ時に使います。
※私はこのOptional Chainingについて理解ができておらず、すごく苦しみました。

var person: Person?

person = nil
print(petson?.name)
// => nil

person = Person()
person.name = taro
print(petson?.name)
// => "Optional(taro)"

終わりに

Optional型は慣れるまで少し苦しみましたが、Optional型があれば意図しないnilアクセスを減らせるので上手く使いこなしていきたいですね。

参考サイト

Swiftのオプショナル型について
どこよりも分かりやすいSwiftの"?"と"!"


この記事が参加している募集