2017-10-15 3 views
1

辞書の値がゼロであるかどうかを調べるときに混乱していると思われる振る舞いに気付きました。特定の通知の通知ハンドラでは、エラーキーの値がnilであるかどうかをチェックしたいと思います。これをデバッグしようとしたときに、私は次のことを試してみました:辞書の任意の値に対する予期しないnil検査の結果

POのUserInfo [ "エラー"]

▿オプション - 一部:

ゼロ(lldb)POのUserInfo [ "エラー"] ==最初のコマンドの出力を考えると

nilを、私は2番目にtrueを返すと予想しました。何か案が?

おかげ

+0

私はそれがゼロではないと思います。しかし、確認するには、 'po userInfo [" error "]!'の出力が何であるかを調べることができますか? (force unwrap) – Tushar

答えて

0

私は犯人を見つけたと思う:

は、ここでの構造を模倣するコードスニペットです。

let userInfo = [DatabaseRestaurantNotificationPayload.infoDictionaryErrorKe‌​y:nil, DatabaseRestaurantNotificationPayload.infoDictionaryRestaura‌​ntKey:value1] as [String : Any]

とerrorKeyのための辞書を照会するオプション(ゼロ)を返すように1は、これは実際にはエラーキーのオプションを追加してしまい期待するかもしれないものとは異なりいうより:私は次のように辞書を作成していましたそれ自体はありません。

0

あなたは右、どれが何かを含めることができることを知っていますか?オプションのオプションも含めることができます。また、オプションのnilを含めることができます。

ここでは、このようになっているようです。 userInfo ["error"]はnilではなく、省略可能なnilの値を含みます。それは同じことではありません。私はあなたがそのuserInfoをどのように作成したかを確認したいと思います。

2

userInfo["error"]は、Optional<Sometype>.some(Optional<SomeOtherType>.none)を返す。したがってuserInfo辞書にはキー"error"の値がありますが、その値は別のオプションであり、それ自体はnilです。

let userInfo: [String: String?] = [ 
    "something": "something else", 
    "another thing": "yet another thing", 
    "error": nil 
] 

print(userInfo["error"] as Any) // Optional(nil) 
+0

ヘイ・アレックス、それを印刷するときにAnyとキャストする必要がありますか?私はデフォルトでは 'nil'であるべきだと考えます。 –

+0

@AhmadFこれは必須ではありませんが、Swiftのコンパイラは、 'Any? 'を' Any'に強制するときに警告します。通常はコードの匂いです。どのような 'デフォルト'あなたについて話している? – Alexander

+0

結果を「任意(nil)」にする必要がありませんが、言及したように、コンパイラは警告を発します。 –

関連する問題