迭代除了数组的最后一个索引之外的所有索引

时间:2016-12-04 23:37:28

标签: swift swift3

据我所知,在Swift 3中,典型的C Style for循环有一些变化。我一直在努力解决这个问题,但在很多情况下,我似乎写了比以前更多的代码。也许有人可以引导我朝着正确的方向前进,因为这就是我想要的:

let names : [String] = ["Jim", "Jenny", "Earl"]
for var i = 0; i < names.count - 1; i+=1 {
    NSLog("%@ loves %@", names[i], names[i+1])
}

非常简单的东西。我希望能够得到我所关注的索引,如果names.count == 0,我喜欢for循环不运行。一气呵成。

但似乎我在Swift 3中的选择并不允许我这样做。我必须做类似的事情:

let names : [String] = ["Jim", "Jenny", "Earl"]
if names.count > 0 {
    for i in 0...(names.count - 1) {
        NSLog("%@ loves %@", names[i], names[i+1])
    }
}

需要一开始的if语句,因为我的程序会在以下情况下崩溃:for in in 0 ... 0 {}

我也喜欢能够在没有明确设置索引的情况下迭代所有内容的想法:

// Pseudocode
for name in names.exceptLastOne {
    NSLog("%@ loves %@", name, name.plus(1))
}

我觉得有某种语法混合了我的所有需求,但我还没有遇到它。有谁知道一种方式?或者至少是一种让我的代码更紧凑的方法?

更新:有人建议已经提出这个问题,引用了一个SO帖子,解决方案是使用某种程度的:

for (index, name) in names.enumerated {}

与Hamish的答案相比,这个问题是我只得到了当前名字的索引。这不允许我在索引处获取值而不需要执行以下操作:

names[index + 1]

这只是一个额外的变量来跟踪。我更喜欢Hamish's:

for i in names.indices.dropLast() {
    print("\(names[i]) loves \(names[i + 1])")
}

简短,简单,只需跟踪名称和i,而不是名称,索引和名称。

0 个答案:

没有答案