解析swift中的浮点数问题?

时间:2018-02-09 11:03:06

标签: swift dictionary

今天我从字典中获取价值时遇到了一个非常奇怪的情况。我在这里做了两个案例。

案例1

如果我在下面写代码

let str = "{\"num\":2}"

var dict = convertToDictionary(text: str)!

if let num = dict["num"] as? Float {
    print("Value is \(num)")
} else {
    print("parse error")
}

func convertToDictionary(text: String) -> [String: Any]? {
    if let data = text.data(using: .utf8) {
        do {
            return try JSONSerialization.jsonObject(with: data, options: []) as? [String: Any]
        } catch {
            print(error.localizedDescription)
        }
    }
    return nil
}

正如您所看到的,密钥num的值为Integer,但在从字典中获取值时,我希望值为Float。所以它应该转到else块但是它打印了值。

案例2

var test = 2
var dict:[String:Any] = [String:Any]()
dict["num"] = test
if let num = dict["num"] as? Float {
        print("Value is \(num)")
} else {
        print("parse error")
}

由于我没有定义数据类型所以默认情况下它应该是整数和&我希望价值为Float。这确实有效 现在这里没有打印它显示parse error

的值

请向我解释为什么会这样?

3 个答案:

答案 0 :(得分:3)

答案是 - 这两个案例中的词典实际上并不相同。

在第二种情况下,dict["num"]类型中Int的值,因为您明确指定了Int

但是,在第一种情况下,您会通过JSONSerialization获取字典,将数字转换为NSNumber个实例。因此,dict["num"]的值为NSNumber类型。使用NSNumber初始化的Int可以成功投放到IntFloat

答案 1 :(得分:0)

在第一种情况下,您正在创建json并插入dict,其中获取[String: Any]格式的值。此处dict["num"]采用NSNumber格式。

在第二种情况下,您使用dict格式创建了[String: Any],但将值设为Intvar test = 2此行将变量test设置为Int,当您将该值插入dict格式[String: Any]时,它将格式Any的值设为Int

所以基本上在第二种情况下,dict["num"]Int

From Apple Doc,变量将采用它在开头分配的值的数据类型。

这就是为什么你可以在第一种情况下将Any转换为Float但在第二种情况下无法将Int转换为Float。

如果您尝试使用var test: Float = 2,您也会在第二种情况下获得值。

答案 2 :(得分:0)

尝试

/home/alperen/Desktop/scpTest