Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/swift/22.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Swift 3错误:类型';任何';没有下标成员_Swift - Fatal编程技术网

Swift 3错误:类型';任何';没有下标成员

Swift 3错误:类型';任何';没有下标成员,swift,Swift,所以我知道这个问题已经被问过很多次了,也回答过很多次了,但是我刚刚把我的项目迁移到Swift 3,我在解析JSON的代码中遇到了很多这样的错误,我无法找到让我理解如何解决我的具体问题的答案 guard let result = try JSONSerialization.jsonObject(with: data!, options: []) as? [String:AnyObject] else { return } guard let responseData

所以我知道这个问题已经被问过很多次了,也回答过很多次了,但是我刚刚把我的项目迁移到Swift 3,我在解析JSON的代码中遇到了很多这样的错误,我无法找到让我理解如何解决我的具体问题的答案

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行抛出上述错误,但不太确定在Swift 3中应该如何处理?有人能解释并建议一个最佳实践解决方案吗

非常感谢

?[String:AnyObject]else{return}。我想这会解决你的问题

顺便说一句,你不需要在if-let中强制打开userData,因为你已经在guard中打开了它。

if
responseData[“UserProfile”]
也是一本字典,你可能想在guard中使用它,说
guard-let-userData=responseData[“UserProfile”]As?[String:AnyObject]else{return}
。我想这会解决你的问题


顺便说一句,您不需要在if-let中强制展开用户数据,因为您已经在guard中展开了它。

Hmm,很酷。但是,自Swift 2以来,这种行为发生了怎样的变化,为什么会发生变化?老实说,这应该一直是个问题-如果你不转换responseData[“UserProfile”],编译器只知道它是任何对象,而你不能下标它。如果不亲自运行代码,我无法确定。最终,Swift希望您真正明确地了解对象的类型,因此最好按照我描述的方式检查guard语句中的类型,除非您使用泛型或其他类型。虽然打字稍微多了一点,但为了避免这些bug,还是值得的。谢谢,我完全同意你的观点,尽管令人费解的是Swift 2没有对此做出反应。干杯我不确定这是否有任何关系,但在Swift2中,许多类型是自动生成的
AnyObject
,而在Swift3中,许多类型是从
AnyObject
更改为
any
。我曾经处理过许多在Swift2中工作的案例,因为有些东西是AnyObject,它比Any更具体、更方便。如果不深入了解您的具体错误,我可以说它闻起来很相似,因为从Swift2回归到Swift3Hmm,很酷。但是,自Swift 2以来,这种行为发生了怎样的变化,为什么会发生变化?老实说,这应该一直是个问题-如果你不转换responseData[“UserProfile”],编译器只知道它是任何对象,而你不能下标它。如果不亲自运行代码,我无法确定。最终,Swift希望您真正明确地了解对象的类型,因此最好按照我描述的方式检查guard语句中的类型,除非您使用泛型或其他类型。虽然打字稍微多了一点,但为了避免这些bug,还是值得的。谢谢,我完全同意你的观点,尽管令人费解的是Swift 2没有对此做出反应。干杯我不确定这是否有任何关系,但在Swift2中,许多类型是自动生成的
AnyObject
,而在Swift3中,许多类型是从
AnyObject
更改为
any
。我曾经处理过许多在Swift2中工作的案例,因为有些东西是AnyObject,它比Any更具体、更方便。如果不深入研究您的具体错误,我可以说,考虑到从Swift2到Swift3的回归,它闻起来很相似