访问Swift字典值时出错

时间:2016-10-18 20:45:11

标签: swift

我正在使用提供的值从字典中访问数组值:

print("thisFrom "+thisFrom)
print(values[thisFrom])
let ingredientArr = values[thisFrom] as! [String: Float]

但这是输出:

thisFrom cup
Optional(["butter": 226.80000000000001, "caster sugar": 225.00730999999999, "granulated sugar": 200.0, "tbsp": 16.0, "ml": 236.58823649999999, "flour": 125.0, "tsp": 48.0, "icing sugar": 125.0])
fatal error: unexpectedly found nil while unwrapping an Optional value

nil行显示值且结果数组有效时,我不明白如何返回print

我正在使用Swift 3。

3 个答案:

答案 0 :(得分:1)

values[thisFrom]不属于[String: Float]类型。而是[String: Double]

为什么?

让我们看看关键“黄油”的值:它是一个floating-point数字,精度超过6位小数。所以它不能是Float。这就是强制投射失败的原因。

答案 1 :(得分:0)

它所引用的解包是as之后的感叹号。你写的内容与:

相同
let optionalAttemptedCast = values[thisFrom] as? [String: Float]
let ingredientArray = optionalAttemptedCast!

希望这清楚地说明失败的是演员阵容。也就是说,values[thisFrom]确实存在,正如您从print()看到的那样,但它无法转换为[String: Float]类型。

答案 2 :(得分:0)

当我把这段代码放在游乐场时:

let values: [String: Any?] = ["cup": ["butter": 226.80000000000001, "caster sugar": 225.00730999999999, "granulated sugar": 200.0, "tbsp": 16.0, "ml": 236.58823649999999, "flour": 125.0, "tsp": 48.0, "icing sugar": 125.0]]

let thisFrom = "cup"
let ingredientArr = values[thisFrom] as! [String: Float]

Xcode给了我你看到的错误。如果我将引发解包错误的行更改为

let ingredientArr = values[thisFrom] as! [String: Double]

工作正常。

似乎您的字典属于[String: Double]类型,而不是[String: Float]

我建议您将强制转换更改为可选的强制转换:

if let ingredientArr = values[thisFrom] as? [String: Double] {
    // safely casted to [String: Double]
}