【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コード)

関連記事

I20160102-131507.jpg

Swift 2の文法が分かるオススメ本「詳解 Swift 改訂版」

Swift文法書の定番とも言える、荻原 剛志さんの「詳解 Swift」。 Swiftの文法をキ

記事を読む

20150410-122409.jpg

複数バージョンのXcodeを共存してMacにインストールする方法

いよいよXcode 6.3が正式にリリースされましたね。 今回は複数バージョンのXco

記事を読む

I20151103-131550.jpg

iPhoneアプリ開発にオススメの本7選(初心者向け含む)2015年11月版

Xcode 7/Swift 2/iOS 9に対応した関連書籍が揃ってきたので、iPhoneア

記事を読む

I20160525-233821.jpg

SwiftBondを使ってみた。observeやObservableの使い方など

Swiftバインディングフレームワークである「SwiftBond」を使ってみました!

記事を読む

20150525-224340.jpg

【Swift】クロージャをメソッドや関数の引数として渡す方法

Swiftでメソッドの引数としてクロージャを渡す方法について解説したいと思います。     

記事を読む

20140905-180905.jpg

英語苦手な人がSwiftを学びたいならこの本を読むといいよ!

アップルのWWDC2014で発表された、iOSおよびOS Xのためのプログラミング言語「Swift」

記事を読む

20150109-223509.jpg

【Xcode 6】対応する開き括弧と閉じ括弧を調べる方法

Xcodeで、対応する開き括弧と閉じ括弧のを調べる簡単な方法があったので紹介したいと思います!

記事を読む

20141222-120336.jpg

【Swift】PlaygroundでUIImageに画像を読み込む方法

SwiftのPlayground内にて、UIImageに画像ファイルを読み込む方法を紹介しま

記事を読む

I20150720-150147.jpg

Apple Watchアプリを作りたいならこの書籍!「詳細!Apple Watch アプリ開発 入門ノート」

     Apple Watchアプリの作り方を学ぶのにオススメな書籍、「詳細!Apple W

記事を読む

20141027-113224.jpg

【Swift】「詳解 Objective-C 2.0 第3版」の著者による「詳解Swift」が予約受付中!

「詳解 Objective-C 2.0 第3版」の筆者「荻原 剛志」さんによる新しい技術書「詳細

記事を読む

20170423-182541
良肌研究室のフェイスウォッシュとオールインワンジェルを使ってみた

株式会社ブラシナさんから、良肌研究室の商品をご提供頂いたので、

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で、タブバーアイコン非選択時の

→もっと見る

PAGE TOP ↑