2016-10-07 11 views
0

この質問は以前に何度も尋ねられていましたが、私は自分のプロジェクトをSwift 3に移行しました。 JSONを解析して、私の特定の問題を解決する方法を理解できた答えを見つけることができませんでした。Swift 3エラー:タイプ 'Any'に下付きのメンバーはありません

guard let result = try JSONSerialization.jsonObject(with: data!, options: []) as? [String:AnyObject] else { 
     return 
    } 
    guard let responseData = result["Data"] else { return } 
    guard let userData = responseData["UserProfile"] else { return } 

    var userProfileFieldsDict = [String: String]() 

    if let sessionToken = userData!["CurrentSessionToken"] as? NSString { 
     userProfileFieldsDict["sessionToken"] = String(sessionToken) 

    } 
} 

if let sessionTokenラインは、前述のエラーがスローされますが、あなたはスウィフト3でこれに対処することになっているか、非常にわかりませんか?誰か説明してベストプラクティス修正を提案できますか?

ありがとうございました!

答えて

3

responseData["UserProfile"]も辞書の場合は、おそらくそれをあなたのようにキャストしたいと思って、guard let userData = responseData["UserProfile"] as? [String : AnyObject] else { return }と守ってください。私はこれがあなたの問題を解決すると思う。

ごくわずかですが、if letでuserDataのアンラップを強制する必要はありません。これは、すでにガードにラップされていないためです。

+0

Hmm、cool。しかし、Swift 2以降、どのように、なぜこの動作が変わったのですか? – ardevd

+0

正直なところ、これはいつも問題であったはずです。レスポンスデータ["UserProfile"]をキャストしないと、すべてのコンパイラが知っているのは、それがAnyObjectだということです。コードを自分で実行することなく確実に言えるわけではありません。 – creeperspeak

+0

最終的には、Swiftはオブジェクトの種類について実際に明示したいと思っています。したがって、ジェネリックスなどを使用していない限り、ガードステートメントのタイプを私が記述した方法でチェックするのは間違いなくベストプラクティスです。これはもう少しタイピングですが、この種のバグを避けるには価値があります。 – creeperspeak

関連する問題