我整理了以下示例代码:
let tings = [1, 2, 4, 5, 6, 8]
class Foo {
var number: Int
init(something: Int) {
self.number = something
}
}
var list: [Foo] = []
for num in tings {
var temp = Foo(something: tings[num]) //excbadinstruction invop
list.append(Foo(something: 3)) //no error
list.append(Foo(something: Int(4))) //no error
list.append(Foo(something: tings[num])) //excbadinstruction invop
list.append(Foo(something: Int(tings[num]))) //excbadinstruction invop
}
我不知道最后两行的问题是什么,因为在我看来,[num]类型也是Int类型,当然与最后一行相同。
如果我指定事物的类型为[Int],则没有任何变化(这对我来说并不奇怪) 我还必须明确说出'something:',这是我没想到的,因为它是初始化器的第一个也是唯一的参数。
我希望任何人都可以向我解释和/或给出正确的方法来做到这一点。
答案 0 :(得分:2)
Swift Playground非常有趣,但在调试方面它非常糟糕。
如果我们在实际的可编译和可构建应用程序中复制此代码,则不会出现构建时警告或错误。但是,只要我们点击播放并运行代码,问题就很明显了。控制台打印:
fatal error: Array index out of bounds
这就是问题...我们的数组有六个元素。这意味着最大可访问索引是5。
看看我们的循环:
for num in tings {
// do stuff
}
如果我们更改循环以打印num
,请执行以下操作:
for num in tings {
println(num)
}
您会看到它打印出我们的tings
数组:
1
2
4
5
6
8
现在让我们访问每个索引处的元素:
for num in tings {
println(tings[num])
}
打印什么?
2
4
6
8
fatal error: Array index out of range
发生了什么事?
我们试图访问第6个索引,因为循环的第五次迭代,即数组的第五个元素,是Int
6.我们试图访问第6个元素,这是我们的数组的边界。
如果您尝试迭代tings
的元素并为每个元素实例化Foo
,那么您只需要:
for num in tings {
list.append(Foo(something: num))
}
正如Paul在评论中指出的那样,如果你需要索引,你可以循环遍历循环:
for (index, value) in enumerate(tings) {
// do stuff
}