此代码在Swift 2中运行良好:
guard let userData = responseData["UserProfile"] as? [String : AnyObject] else { return }
var userProfileFieldsDict = [String: String]()
if let profileUsername = userData["Username"] as? NSString {
userProfileFieldsDict["username"] = String(profileUsername)
}
if let profileReputationpoints = userData["ReputationPoints"] as? NSNumber {
userProfileFieldsDict["reputation"] = String(profileReputationpoints)
}
但是,Swift 3
在userProfileFieldsDict["reputation"]
说
init已重命名为init(描述:)
我的问题是为什么它会触发该行而不是userProfileFieldsDict["username"]
分配行,以及如何修复它?我假设是因为我正在向NSNumber
施放String
,但我无法理解为什么这很重要。
答案 0 :(得分:11)
NSNumber是一个非常通用的类。它可以是从bool
到long
甚至是char
的任何内容。所以编译器确实不确定确切的数据类型,因此它无法调用正确的String构造函数。
而是使用String(describing: )
构造函数,如下所示
userProfileFieldsDict["reputation"] = String(describing: profileReputationpoints)
此处还有info更多信息。
答案 1 :(得分:3)
您需要放弃使用Objective-C类型。这总是一个坏习惯,现在鸡回家了。不要施放给NSString和NSNumber。转换为String和实际的数字类型。例如:
if let profileUsername = userData["Username"] as? String {
userProfileFieldsDict["username"] = profileUsername
}
if let profileReputationpoints = userData["ReputationPoints"] as? Int { // or whatever
userProfileFieldsDict["reputation"] = String(profileReputationpoints)
}