数组中的可选值

Optional value in array

谁能给我解释一下为什么这里的代码 returns 错误: "fatal error: unexpectedly found nil while unwrapping an Optional value"

if let steps = legs[0]["steps"] {
    for i in 0...steps.length {
        print(steps[i])
    }
}

而这段代码:

let steps = legs[0]["steps"]!
print(steps[0])

returns 想要的输出?我很困惑,因为我无法以某种方式获取数组中包含的所有步骤的值..

同样:

for i in 0...legs[0]["steps"]!.length {
    print(legs[0]["steps"]![i]["start_location"])
}

在以下情况下出现致命错误:

print(legs[0]["steps"]![0]["start_location"])

returns 可选值

长度??

首先steps的类型是什么?如果它是一个数组,它没有 length 属性 但 count.

发生了什么事?

让我们看一下这个示例代码片段

let words = ["Hello", "world"]

for i in 0...words.count {
    print(words[i])
}

这里 words.count2 所以 for 被执行了 3 次 (i=0, i=1, i=2)。 由于数组索引从 0 开始,因此可以使用以下元素

words[0] // "Hello"
words[1] // "world"

正如您可以想象的那样,循环的最后一次执行(当 i=2 时)确实访问了不存在的 words[2]!这会导致崩溃。

访问正确的索引

现在让我们来看看你的for loop

for i in 0...steps.length {
    print(steps[i])
}

如前一段所述,在最后一次循环执行中,您正在访问一个不存在的元素。应该是

for i in 0..<steps.count {
    print(steps[i])
}

对于

更好的是你可以摆脱索引并简单地写

for step in steps {
    print(step)
}

每个

另一种语法,与上一个代码块的结果相同

steps.forEach { step in
    print(step)
}