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

関連記事

I20160125-104438.jpg

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

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

記事を読む

20150116-114410.jpg

プログラミング未経験者がSwiftの文法を学ぶのにオススメな本!「たのしいSwiftプログラミング」

楽しみにしていたSwiftの入門書「たのしいSwiftプログラミング」を読み終わったので、レビュ

記事を読む

I20151201-120520.jpg

【Swift 2】switch内にてguardでbreakする

Swift 2のguard内ではreturnしないと文法エラーとなりますが、実はswitch

記事を読む

20141119-114354.jpg

【iOSアプリ開発】隙間時間で読んで学ぶのにオススメな入門本「はじめてのSwiftプログラミング」

「はじめてのSwiftプログラミング」という入門書が手頃なサイズで、持ち歩いてスキマ時間で読んで

記事を読む

20160811-173801.jpg

【iOS】特定のセルがUITableViewの表示領域内に収まっているかどうかを調べる

特定のセルがUITableViewの表示領域内に収まっているかどうかを調べる方法を紹介します。


記事を読む

20141227-125250.jpg

実践的な内容まで載っている!開発のプロが教える Swift標準ガイドブック

株式会社マイナビ様より「開発のプロが教える Swift標準ガイドブック」の見本紙を頂きました。早

記事を読む

I20150805-182005.jpg

Swiftにおける関数型のエッセンスを学ぶために「関数プログラミング実践入門」を読み始めた

Swiftの関数型言語的な特徴についての話を各所で見るようになりましたが、自分は関数型言語の

記事を読む

I20150724-135442.jpg

iPhoneのホーム1画面目に置いているオススメなアプリ38本(2015年9月版)

2014年7月に「iPhoneアプリ開発にオススメの本10選(2014年7月版)」という記事

記事を読む

I20160118-223109.jpg

Swift 2でシングルトンを初期化・呼び出しする方法

Swift 2でシングルトンを実装する方法について解説したいと思います! (※「シングルトンを

記事を読む

20150104-120413.jpg

【おすすめ本】Swiftではじめる iPhoneアプリ開発の教科書【iOS 8&Xcode 6対応】

     入門者にオススメな、Swift&Xcode 6の入門書「Swiftではじめる

記事を読む

I20170521-225453.jpg
東京駅八重洲口の「羊肉酒場 悟大」で網焼きジンギスカンを頂きました!

ゆうせいさんと株式会社 大庄さんからご招待頂き、悟大withサッポ

I20170514-165235.jpg
iPhoneと連携できる体重体組成計「Withings Body Cardio」を使ってます

ジムに通い始めて体脂肪率が落ち始めたのをキッカケに、iPhoneと

I20170507-155440.jpg
【派手髪】ハーレイクイン風の髪色に染めてもらいました

2016年10月20日、ハーレイクイン風の髪色に染めてもらいました

I20170504-173110.jpg
【メンズネイル】東京・新宿のネイルサロンでターコイズのホログラムネイルしてもらった

ネイルネタが1年分くらい溜まっているので、ちょっとずつ書いていこう

I20170502-010117.jpg
SNUGGのライトニングケーブルが耐久性高し。8ヶ月使ってますが断線の気配なし!

iPhoneの充電&転送ケーブルであるLightningケーブルっ

→もっと見る

PAGE TOP ↑