更新到Xcode 8.1:无法再将AnyObject类型的JSON数据转换为预期的Type

时间:2016-11-09 16:28:12

标签: json swift swift3

当收到字典[String:AnyObject]时,我的解析现在失败了。当我以前能够转换时,例如以下内容:

模型很简单:

class Invoice:NSObject {
    var id:String
    var amount:Float

    init?(json: [String:AnyObject]) {
        if let id = json["id"] as? String {
            self.id = id 
        }
        if let amount = json["amount"] as? Float {
            self.amount = amount
        }
    }
}

输入例如:[" id":" 1","金额":0]或[" id": " 1","金额":4]或[" id":" 1","金额":4.50 ]

从XCode 8.1开始,我的模型现在返回nil,我看不出原因。 8.1改变了铸造或什么?

2 个答案:

答案 0 :(得分:1)

  

更改我的'如果让'的工作原理。

var amount:Double

Xcode 8.0

if let amount = json["amount"] as? Float {
   self.amount = amount
}

Xcode 8.1

if let amount = json["amount"] as? NSNumber {
   self.amount = amount.doubleValue
}

答案 1 :(得分:0)

您的班级init方法在这种情况下无法正常工作,因为有些属性可能因为在您的工作中无法解开而无法初始化if let陈述。

所以你必须为这些属性设置一些默认值:

var id: String = ""
var amount: Float = 0

另一种方法是为展开添加一个else案例:

if let amount = json["amount"] as? Float {
    self.amount = amount
} else {
    amount = 0
}

这与我们之前设置的默认设置基本相同,因此将其作为上述第一种方式保留更为明确。

或者,更简单的是,如果您不想要特定属性的默认设置,则必须将其设为可选项,例如

var id: String?