0

我整理了以下示例代码:

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
}

我不明白最后两行的问题是什么,因为我认为 things[num] 也是 Int 类型,当然最后一行也是如此。

如果我将事物的类型指定为 [Int],则没有任何变化(这对我来说并不奇怪)我还必须明确声明“某事:”,这是我没想到的,因为它是初始化程序的第一个也是唯一的参数。

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

4

1 回答 1

2

Swift Playground 很有趣,但在调试方面却非常糟糕。

如果我们在实际可编译和可构建的应用程序中复制此代码,我们不会收到构建时警告或错误。然而,只要我们点击播放并运行代码,问题就很明显了。控制台打印:

fatal error: Array index out of bounds

问题来了……我们的数组有六个元素。这意味着最大可访问索引为 5。

看看我们的循环:

for num in tings {
    // do stuff
}

如果我们将循环更改为 print 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 个索引,因为循环的第五次迭代,数组的第五个元素是Int6。我们正在尝试访问第 6 个元素,这超出了我们的数组的范围。


如果您尝试迭代 的元素并为每个元素tings实例化 a ,您只需要这样:Foo

for num in tings {
    list.append(Foo(something: num))
}

或者正如 Paul 在评论中指出的那样,如果您需要索引,您可以像这样遍历循环:

for (index, value) in enumerate(tings) {
    // do stuff
}
于 2014-11-26T00:38:39.753 回答