Swift:将AnyObject强制转换为Float失败

3
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的值是nil,而sss的值是0.599999998。将其转换为Float时为什么会变成nil呢?你们有什么方法可以帮我得到正确的结果吗?


1
你应该使用 Any 而不是 AnyObject。let json:[String: Any] = [ "left" : 18, "deadline" : "May 10", "progress" : 0.6 ] - Leo Dabus
如果您想存储Float而不是Double,您需要指定Float(0.6),否则编译器将推断类型为Double。 - Leo Dabus
1
使用 AnyObject 是毫无意义的。Float 不是 AnyObject,它如果使用 AnyObject 存储,则会被存储为 NSNumber。 - Leo Dabus
1
是的,你说得对。"progress" : Float(0.6)。改成这样是有意义的。感谢你的帮助。 - Leaf
不用担心,无需将 let js:[String: Any] = [ "left" : 18, "deadline" : "May 10", "progress" : Float(0.6) ] 进行类型转换。 - Leo Dabus
显示剩余2条评论
1个回答

2
< p> 0.6 是一个 Double 的字面值。因此,你不能将它强制转换为 Float (需要进行转换)。

尝试使用以下代码:

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

如果你不确定这个 AnyObject 变量存储的是什么类型的数字,更安全的方式是:

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

当JSON值缺失或者你错误地判断了期望的类型时,上述代码将会崩溃。如果你有不同的看法,请使用as?运算符代替as!运算符 :)
强制转换速成课。当将已知的Double值强制转换为Float时,编译器会给我们一个很好的提示:
let d = 0.6
let f = d as? Float

警告:将“Double”强制转换为不相关的类型“Float”总是失败的。

@LeoDabus Good Leaf 还在学习 Swift 的路上... 快速失败确实很有帮助!但是静默错误就不太行了... - Paulo Mattos
@LeoDabus 为了明确,如果我们将其保留为 Float?,他将一直使用 ?,并且当他的代码最终崩溃时将完全迷失方向。只需看看那些错误地疯狂使用 ? 的 SO 新手问题就知道了,哈哈... - Paulo Mattos
@LeoDabus 我总觉得他还在你的测试阶段上... :-) 不管怎样,感谢你详细的反馈! - Paulo Mattos

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接