2017-03-11 8 views
0

私はスウィフトを学んだし、私はそれは動作しますが、私は私が欠落している可能性があり感じスウィフト3試し

let value = (try? getValue()) ?? "Default Value" 

に短縮することができ、次のコード

var value: String; 
do { 
    value = try getValue() 
} catch { 
    value = "Default Value" 
} 

をテストしていますより明白な解決策です。

+2

もう少し単純な解決策はありません。 'let let value = try? 'を使うことができます。 getValue(){'しかし、それはあなたの最初のバージョンのちょっと変わったものです。 – Sulthan

+1

_question_とは何ですか? – matt

+0

@matt良い方法がありますか?私は、私のJavascript(ノード)知識をSwift言語に融合するのではなく、迅速なやり方をしようとしています。 – Wainage

答えて

1

あなたのソリューションはすばらしく、とてもエレガントです。

最初の行にvarと言っておき、あとで変数を初期化することは避けたいと思います。一般に、複雑な初期化子ですぐに値を初期化する方法は、コール定義-及び構築物を使用することです:

let value: String = { 
    do { 
     return try getValue() 
    } catch { 
     return "Default Value" 
    } 
}() 

そして、あなたはおそらくcatchブロックがerror情報を返したかということしたいと思いますキャプチャしたかった

しかし、このの場合、エラーの性質を無視している場合、式ははるかにコンパクトで、正確に何をしたいのですか。 try?はオプションを返します。成功するとアンラップされるか、失敗した場合はnilが返され、代替値("Default Value")が使用されます。

+0

私が間違っていると私を訂正します。しかし、それは本質的に直ちに呼び出されるラムダですか?それは特にあなたが異なるエラーに対処する必要がある場合はかなり滑らかです。 – Wainage

+0

"これは本質的に直ちに呼び出されるラムダです"あなたはあなたのLISPに賭ける。私からのより多くの議論、ここに:http://www.apeth.com/swiftBook/ch02.html#SECdefineandcallそしてここに:http://www.apeth.com/swiftBook/ch03.html#_computed_initializer – matt

+0

そのリンクとこの情報をコミュニティに提供します。私は間違いなくそれを熟読します。 – Wainage