数组中的可选值

时间:2016-08-04 15:40:34

标签: ios arrays swift optional

有人可以向我解释为什么这里的代码会返回错误: "致命错误:在展开可选值"

时意外发现nil
if let steps = legs[0]["steps"] {
    for i in 0...steps.length {
        print(steps[i])
    }
}

这段代码:

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

返回所需的输出?我很困惑,因为我无法以某种方式得到数组中包含的所有步骤值。

同样:

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

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

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

返回一个可选值

1 个答案:

答案 0 :(得分:2)

长度??

首先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)
}