Init已在Swift 3中重命名为init(描述)错误

时间:2016-10-07 17:16:50

标签: swift swift3

此代码在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 3userProfileFieldsDict["reputation"]

时会引发错误
  

init已重命名为init(描述:)

我的问题是为什么它会触发该行而不是userProfileFieldsDict["username"]分配行,以及如何修复它?我假设是因为我正在向NSNumber施放String,但我无法理解为什么这很重要。

2 个答案:

答案 0 :(得分:11)

NSNumber是一个非常通用的类。它可以是从boollong甚至是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)
}