2017-04-26 33 views
1
let json = [ 
    "left" : 18, 
    "deadline" : "May 10", 
    "progress" : 0.6 
] as [String: AnyObject] 

let ss = json["progress"] as? Float 
let sss = json["progress"] as? Double 
print("ss = \(ss)\n sss = \(sss)") 

我不知道为什么ss显示为零,而sss显示0.599999998。为什么铸造到Float得到零?你们有一些方法,以便我可以得到正确的结果吗?斯威夫特:AnyObject投漂浮失败

+0

你应该使用any而不是AnyObject let json:[String:Any] = [“left”:18,“deadline”:“May 10”,“progress”:0.6]' –

+0

如果你想存储一个Float你需要将它指定为'Float(0.6)',否则编译器会推断出类型(Double) –

+0

我试图使用Any,但是它产生了没有意义。 – Elena

回答

1

0.6Double文字值。因此,你不能将它投到Float(你需要转换成吧)。

试试这个:

let f = Float(json["progress"] as! Double) 

或者,如果你真的不知道该AnyObject成立,更安全的方法是什么类型的号码:

let f = (json["progress"] as! NSNumber).floatValue 

当然,那些as!以上将崩溃如果json值丢失您误判预期的类型。使用as?操盘手,如果你觉得另有:)


铸造速成班。当铸造已知Double值到Float,编译器为我们提供了一个很好的头了这一点:

let d = 0.6 
let f = d as? Float 

警告:投从“双师型”到不相关类型的“浮动”总是失败

+0

@LeoDabus好叶在这里仍然在斯威夫特周围学习他的方式......快速失败帮助很多!沉默的错误不是那么多... –

+0

@LeoDabus要清楚,如果我们将它作为'Float?',他将一直使用'?',并且在他的代码最终崩溃时完全丢失。只要看看所有这些新手问题,在那里错误地使用'?'就像疯狂哈哈... –

+0

@LeoDabus我觉得他仍然在*测试*阶段你的...... :-)无论如何,谢谢你的详细反馈人! –