【Swift】コードをコンパクトに記述できるオプショナルチェーン(optional chaining)の性質と活用例

公開日: : 最終更新日:2016/02/10 iPhoneアプリ開発

20150108-113233.jpg

最近はSwiftでコーディングすることが多い@akio0911です。今日はSwiftでコードをコンパクトに記述できる「オプショナルチェーン」という仕組みについて紹介します!

    

スポンサード リンク

オプショナルチェーンの基本

オプショナル型なプロパティを持つ、以下の様なクラス群が定義されていたとします。

class A {
    var b:B?
}

class B {
    var c:C?
}

class C {
    var name:String = ""
    var age:Int = 0

    func isMale() -> Bool {
        return true
    }
    
    func display() {
        print("name = \(name), age = \(age)")
    }
}

    

そして、以下のようにオブジェクトを生成したとします。

var objectC = C()
objectC.name = "sato"
objectC.age = 35

var objectB = B()
objectB.c = objectC

var objectA:A? = A()
objectA!.b = objectB

    

ここでobjectCのnameプロパティにアクセスしたいとします。こんな時に活用できるのが「オプショナルチェーン (optional chaining, optional chain) 」です。

let n = objectA?.b?.c?.name

    

上記のコードは以下の様な動きをします。

  • objectA, b, c の全てがnilでは無い場合、定数nにはnameが代入される
  • objectA, b, c のいずれかがnilの場合、定数nはnilとなる

この時、定数nはnilになりえるので、その型はnameと同じString型ではなく、String?型(オプショナル)となります。

    

オプショナル束縛と組み合わせる

オプショナルチェーンは、以下のようにオプショナル束縛 (optional binding) と組み合わせて使うことができます。

if let name = objectA?.b?.c?.name {
    // objectA, b, c の全てがnilでは無い場合、ここが実行される
    println(name)
}

    

辞書へのアクセスにオプショナルチェーンを使ってみる

SwiftのDictionaryは、キーを指定してアクセスする際にオプショナル型が返ってくるので、以下のように記述することができます。

var dictionary = [String:C]()
dictionary["sato"] = objectC

if let name = dictionary["sato"]?.name {
    // dictionary["sato"] が存在する場合、ここが実行される
    println(name)
}

    

オプショナルチェーンでメソッドを呼び出す

オプショナルチェーンではメソッドも呼び出すことができますが、その場合はメソッドの返り値のオプショナル型が返ってきます。

例えば先程のCクラスで定義されているisMaleメソッドは返り値はBoolなので、このメソッドをオプショナルチェーン内で呼び出すとBool?となります。

// objectA, b, c の全てがnilではない時のみ、isMale()メソッドが呼び出される。
// isMale()の返り値はBool型なので、変数maleの型はBool?(オプショナル)となる。
let male = objectA?.b?.c?.isMale()

    

オプショナルチェーンでメソッドが呼び出されたかどうかをチェックする

オプショナル束縛 (optional binding) と組み合わせることで、isMale()メソッドが呼び出されたか否かによって処理を分岐させることができます。

if let male = objectA?.b?.c?.isMale() {
    println("isMale()が呼び出された")
}else{
    println("isMale()が呼び出されなかった")
}

    

オプショナルチェーンで返り値のないメソッドが呼び出されたかどうかをチェックする

Swiftでは返り値がないメソッドも実際には空タプル () を返すので、返り値がないメソッドをオプショナルチェーン内で呼び出した場合は空タプルのオプショナル ()? を返します。

// retの型は空タプルのオプショナル ()?
let ret = objectA?.b?.c?.display()

    

よって、このことを利用して、返り値がないメソッドが呼び出されたか否かをチェックすることができます。

if objectA?.b?.c?.display() != nil {
    println("display() が呼び出された")
}else{
    println("display() が呼び出されていない")
}

    

オプショナルチェーンを代入先として使う

オプショナルチェーンは、値の参照やメソッドの呼び出しだけでなく、代入先としても使用することができます。

// objectA, b, c の全てがnilでは無いときのみ、代入が実行される
objectA?.b?.c?.name = "suzuki"

    

また、この代入操作は空タプルのオプショナルを返します。よって以下のようにして代入が成功したか否かをチェックすることができます。

if (objectA?.b?.c?.name = "suzuki") != nil {
    println("代入できた")
}else{
    println("代入できなかった")
}

    

@akio0911はこう思った。

オプショナル束縛だけを使っているとコードが煩雑になりがちですが、今回紹介したオプショナルチェーンを使うことでかなりコードをコンパクトに記述できると思います。

    

ちなみにオプショナルチェーンについては以下の書籍が詳しかったです!

この記事が気に入ったら「いいね!」しよう

follow us in feedly

Feedlyで最新記事を購読

Twitterで更新情報をゲット!

LINEでご感想・ご要望お送りください!
(スマホでLINEを起動 > 友だち追加 > QRコード)

関連記事

20150522-105524.jpg

【書籍】初心者にオススメな本!「これからはじめる Apple Watchアプリ開発入門」

Apple Watchは買いましたか?使ってますか?アプリを作ってみたくはないですか? という

記事を読む

I20160505-011515.jpg

iOS 9以降で使えるReadable Content Guideを試してみた

iOS 9から追加されたReadable Content Guide(readableConte

記事を読む

20160724-154909.jpg

デザインの素人がノンデザイナーズ・デザインブックを読んだら、デザインの原則が結構分かるようになった!

ずっとエンジニアとして働いてきてデザインに関してはまったくの素人な僕ですが、「ノンデザイナーズ・

記事を読む

20141224-231137.jpg

【Swift】Auto Layoutで特定のデバイス・画面サイズの時だけ制約を変更する方法

Auto Layoutで、特定のデバイスや画面サイズの時だけ制約を変更する方法について紹介したい

記事を読む

I20150714-010114.jpg

【Swift】Objective-Cで書いたクラスをメソッド単位で少しずつSwiftへ移行する方法

Objective-Cで作った既存のアプリをSwiftで書き直したいと思っているのですが、一

記事を読む

20160416-142928.jpg

Swift 2.2で可能になったタプルの比較を試してみる

Swift 2.2でタプルの比較が行えるようになったので、色々と試してみました。   

記事を読む

I20160125-104438.jpg

iPhoneアプリの開発に必要なものをまとめてみた

僕はアプリ開発講座を開催していますが、その関係もあって「iPhoneアプリを開発するには、ど

記事を読む

20150106-142403.jpg

Auto Layoutをコードで記述してビューを等間隔に並べる【Swift】

Auto Layoutをコードで記述して、ビューを等間隔に並べる方法について紹介します。ちなみに

記事を読む

I20151122-213340.jpg

【入門本】詳細! Swift 2 iPhoneアプリ開発 入門ノート Swift 2 + Xcode 7対応

ソーテック社より「詳細! Swift 2 iPhoneアプリ開発 入門ノート Swift

記事を読む

I20160411-122213.jpg

Swift 2.2の変更点をまとめてみた

2016年3月22日、Xcode 7.3と共にSwift 2.2が正式にリリースされました。

記事を読む

I20170228-002742.jpg
約3ヶ月で体脂肪率を6.2%も落とせたキッカケについて

(右上の赤枠内がダイエット開始前、左下の赤枠内が3ヶ月後の数値

I20161224-174949.jpg
「季節の野菜を直接配送!季節のスムージー」を買ってみた

「FiNCモール」で、「季節の野菜を直接配送!季節のスムージー」を

I20161002-152537.jpg
【メンズネイル】東京・新宿のネイルサロンでマットネイルしてもらった

2016年7月18日、東京・新宿のメンズOKなネイルサロン「Tot

I20160925-163452.jpg
タブバーアイコン非選択時の色を変更する方法【iOS 10】

UITabBarControllerで、タブバーアイコン非選択時の

I20160924-123726.jpg
iPad Pro 9.7インチ SIMフリーモデルにFREETELのSIMを入れて使ってみた

今までiPad miniで使っていたFREETELのSIM

→もっと見る

PAGE TOP ↑