2016-08-05 40 views
0

私はそれから辞書をフェッチしようとすると、今ではとても私にオプションの辞書をどのようにすることができます与えもそれが

let stats = screendata["stats"]! as? NSDictionary 

以下のようにいくつかの辞書や配列が含まれているJSONオブジェクトを持ってアンラップ後の値を持つオプションの取得します私はこのオプションの単語を削除しますか?

print(stats!["reward_listing"]! as? NSDictionary) 

これは私が

Optional({ 
"btn_label" = "905 points to go"; 
description = "Free any size drink at Starbucks"; 
id = 1; 
price = "1000 Points"; 
status = disable; 
title = "Free any size drink at Starbucks"; 
}) 

を取得しています出力され、このオプションの単語を削除する方法について私を導いてください?

+0

'許可すれば統計= screendata [ "統計"]として? [String:AnyObject]、報酬= stats ["reward_listing"]は? [String:AnyObject] {print(報酬)} ' –

答えて

3

screendata["stats"]を強制的にアンラップしていますが、as?演算子を使用してNSDictionaryにキャストしてください。 as?は、キャストが失敗した場合にはnilを返すオプションです。これは、両方のNSDictionary力アンラップにキャストします

let stats = screendata["stats"] as! NSDictionary 

:あなたは、単一のラインに両方の工程を組み合わせることができます。言っていることを、あなたはおそらく、「今すぐにクラッシュしてください」演算子として!を考えて、代わりにif letはるかに安全を使用する必要があります。

if let stats = screendata["stats"] as? NSDictionary { 
    print(stats) 
} else { 
    //either `screendata` had no entry for "stats" or it wasn't an `NSDictionary` 
    print("Couldn't unwrap.") 
} 
-2
print((stats!["reward_listing"]! as? NSDictionary)!) 

はオプションが削除されます。この1と交換してください。 !必要な値は常にいくつかの値があることを意味します。

+2

これは冗長です。それを直後に強制的にアンラップするつもりなら、なぜ「as」を使うのですか?それは 'のようなものです'があります。 – andyvn22

+0

あなたは正しいですが、私は彼が簡単に理解できる方法で彼に答えることを望んでいました。 –

1

確かに、それは常にNSDictionaryになりますが、as?の代わりにas!を使用できます。 これで問題を解決できる可能性があります。彼らは多くの場合、実行時にエラーにつながるので、通常あなたは、感嘆符を取り除く必要があります

if let listing = stats!["reward_listing"] as? NSDictionary { 
    print(listing) 
} else { 
    print("Failed to unwrap") 
} 

: しかし、より良い方法が許可すれば、使用して、このような文を、それをアンラップすることになります。 if-letを使用して最初のステートメントを書き直してください。

+0

"通常、実行時にエラーにつながることが多いので、感嘆符を取り除くべきです。"それは全体のポイントです。バグがどこに現れたか知らずに、コード内に予期しないnil-pointerが浮かぶことなく、最上位レベルのバグを見つけてください。 – ullstrm

0

はこれを試す -

guard let stats = screendata["stats"] as? NSDictionary 
    else 
    { 
    // Value requirements not met, do something 
    return 
    } 

    // Do stuff with stats 
+1

'' nil''をテストしてからforce-unwrapをテストしないでください。それは「もしかしたら」というものです。 – andyvn22

関連する問題