読者です 読者をやめる 読者になる 読者になる

SIN@SAPPOROWORKSの覚書

C#を中心に、夜な夜な試行錯誤したコードの記録です。

Swift 2.0 で追加されたguard の有効利用

最近、Swift書き始めたのですが、C#には無い「オプショナル型」が結構気に入ってます。
長く辛かった、nilとの戦いに勝てそうな気がしてます。

guard

guardは、Swift 2.0 で新たに追加された構文です。
The Swift Programming Language: Statements
f:id:furuya02:20150815101451p:plain

一瞬 if と何が違うのか?って感じですが、私なりに有効な利用場面を結論付けてみました。

if let

if , let のセットで、オプショナル型をアンラップして処理する定型は、次のような感じでしょうか

func sample(num:Int?){
    if let n = num {
        print(n) // numが有効だった場合のメイン処理
    }
}

if の中にメイン処理を詰め込む感じです。
アンラップされた n も、かっこの中だけで有効なので、利にかなってます。

しかし、文脈的に、パラメータが無効だった場合に、さっさと処理をやめて、そのあとでじっくりメイン処理をしたいという場面もあるはずです。
この場合、Swift1.2までなら、こんな感じになるのでしょうか

// if let はどこへ行った
func sample(num:Int?){
    if num == nil {
        return
    }
    // ここからメイン処理
    print(num!)  // <=ここで!とかが登場してしまう
}
// どうしてもアンラップしてから書きたい場合?
func sample(num:Int?){
    if num == nil {
        return
    }
    // ここからメイン処理
    let n = num!
    print(n)
}
// さすがにこれは無いな・・・
func sample(num:Int?){
    if let n == num {
    
	}else{
	    return
	}
    // ここからメイン処理
    let n = num!
    print(n)
}

どうも美しくない

guard let else

そこで guard 登場
先の文脈は、次のように書けます。

func sample(num:Int?){
    guard let n = num else{
        return
    }
    // ここからメイン処理
    print(n) // <= アンラップされた n が、ここで使用できている
}

ありですね。