2017-03-03 1 views
0

私は辞書からデータを解析しようとしています。私は現在動作するコードを持っているが、私はそれを行うためのより簡潔な方法があると思う。オプションバインディングとそれに続く即時オプションのキャスト

私は私の辞書はこれは私が現在、私を向上させることがしたいデータを解析するために使用していたコードである

let dictionary:[String:Any] = ["pic":"picture"] //opt1 
let dictionary:[String:Any] = ["pic":2]   //opt2 
let dictionary:[String:Any] = ["pi":"this"]  //opt3 

を等しくすることができる何のための3つのオプションがあります。各オプションの

let _pic = dictionary["pic"] 
if _pic != nil && !(_pic is String) { 
    print("error") 
    return 
} 
let pic = _pic as? String 

私はのために発生するさまざまなものが欲しい:

OPT3

を示すべき

OPT1

pic:String? = Optional(picture) 

OPT2エラー

pic:String? = nil 

答えて

0

あなたはこれがデフォルトで

guard let _pic = dictionary["pic"] as? String else { return } 
+0

答えがうまくいけば、これをやっていた問題は私のopt3でした。ここにあるのは、辞書に正しいキーがないときにエラーが発生しないようにすることです。 –

+0

それにif ... elseを使うこともできます。 –

+0

私はそのコードで動作しています。私はそれを改良したより簡潔なバージョンを探しています(辞書から解析したすべてのコードに対してこのコードを繰り返す必要があるからです)。しかし、もっと簡潔なバージョンを作ることができないなら、私はそれを持ってる。 –

0
let _pic = dictionary["pic"] 

、これを試すことができますがあなたのタイプAny?のだ_picのための任意の値を与えます。そのように、あなたのコードはあなたの要件に基づいてOKと思われ、私はあなたが最後の行を必要とは思わない。let pic = _pic as? String

+0

は、私はそれがクラッシュかもしれ最後のオプションのためだと思います。 –

+0

彼は現在値を使用したい場合を除いて、値が '!= nil'であるかどうかをチェックしてから、型キャストする前に'文字列 ' –

+0

ええ、私はその目的を明確にしていない可能性がありますし、その変数を使用することです、そして、変数は文字列でなければなりませんか?それを示すために質問を編集します。 –

0

私はあなたが2つのテストを行う必要があると思う。ここには1つの方法があります:

guard let picAsAny = dictionary["pic"] 
else { /* No key in the dictionary */ } 
guard let pic = picAsAny as? String 
else { /* error wrong type */ } 

// pic is now a (nonoptional) string 

明らかに、コンテキストに応じてガードの代わりにif文を使用できます。

関連する問題