首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >更新到Xcode8.1:无法再将AnyObject类型的JSON数据转换为预期类型

更新到Xcode8.1:无法再将AnyObject类型的JSON数据转换为预期类型
EN

Stack Overflow用户
提问于 2016-11-10 00:28:12
回答 2查看 105关注 0票数 0

当接收到字典字符串:AnyObject时,我的解析现在会因为一些琐碎的东西而失败。当我能够转换的时候,例如:

模型很简单:

代码语言:javascript
复制
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","amount":0或"id":"1","amount":4或"id":"1","amount":4.50

从XCode 8.1开始,我的模型现在返回nil,我不明白为什么。是不是8.1改变了投射或者别的什么?

EN

回答 2

Stack Overflow用户

发布于 2016-11-14 18:20:55

更改我的'if let‘是否起作用。

代码语言:javascript
复制
var amount:Double

Xcode 8.0

代码语言:javascript
复制
if let amount = json["amount"] as? Float {
   self.amount = amount
}

Xcode 8.1

代码语言:javascript
复制
if let amount = json["amount"] as? NSNumber {
   self.amount = amount.doubleValue
}
票数 1
EN

Stack Overflow用户

发布于 2016-11-10 01:17:08

在这种情况下,类的init方法将无法工作,因为由于if let语句中的展开不起作用,类的一些属性可能不会被初始化。

因此,您必须为这些属性设置一些默认值:

代码语言:javascript
复制
var id: String = ""
var amount: Float = 0

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

代码语言:javascript
复制
if let amount = json["amount"] as? Float {
    self.amount = amount
} else {
    amount = 0
}

这基本上与我们之前所做的设置默认值相同,因此将其保留为上面描述的第一种方法会更清楚。

或者,更简单的是,如果你不想为一个特定的属性设置默认值,你必须将其设置为可选的,例如

代码语言:javascript
复制
var id: String?
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/40511703

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档