1

一个解析 json 变量并返回浮点数的简单函数。

func parseMyFloat(jsonString: String) -> Float? {
    if let data = jsonString.data(using: String.Encoding.utf8, allowLossyConversion: true),
        let parsedJSON = try? JSONSerialization.jsonObject(with: data, options: JSONSerialization.ReadingOptions.allowFragments) as? [String : Any] {
        if let parsedJSON = parsedJSON {
            return parsedJSON["myFloat"] as? Float
        }
    }
    return nil
} 

现在如果我试试这个。

print(parseMyFloat(jsonString: "{\"myFloat\":23.2322998046875}"))
// output: 23.2322998

输出很好,但是如果我将23.2322998046875值更改为23.2322998046func 返回 nil。

print(parseMyFloat(jsonString: "{\"myFloat\":23.2322998}"))
// output: nil

然后我尝试将 Any 转换为 Float ,但这不起作用。

let dic:[String : Any] = ["float1" : 23.2322998046875, "float2" : 23.2322998]
print(dic["float1"] as? Float) // prints nil
print(dic["float2"] as? Float) // prints nil

我的代码中有很多浮点数,所以在迁移到 swift 4.1 后我遇到了这个问题。

我应该将所有Float的 's 更改为Double's 吗?为什么23.2322998046875有效,为什么不呢23.2322998

4

1 回答 1

1

如果您想保持函数原样并且不想将返回值修改为Double,您可以简单地解析 JSON 值Double以避免按照注释中的说明将 Any 转换为 Float 的问题,然后将其转换DoubleFloat之前退回它。

func parseMyFloat(jsonString: String) -> Float? {
    if let data = jsonString.data(using: String.Encoding.utf8, allowLossyConversion: true), let parsedJSON = (try? JSONSerialization.jsonObject(with: data, options: JSONSerialization.ReadingOptions.allowFragments)) as? [String : Any], let myDouble = parsedJSON["myFloat"] as? Double {
            return Float(myDouble)
    }
    return nil
}

parseMyFloat(jsonString: "{\"myFloat\":23.2322998046875}") //23.2323998
parseMyFloat(jsonString: "{\"myFloat\":23.2322998}") //23.2323998
于 2018-04-12T12:54:43.190 回答