使用数组值来初始化新的数组元素

时间:2014-11-26 00:16:01

标签: arrays swift exc-bad-instruction

我整理了以下示例代码:

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:',这是我没想到的,因为它是初始化器的第一个也是唯一的参数。

我希望任何人都可以向我解释和/或给出正确的方法来做到这一点。

1 个答案:

答案 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
}