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