gpt4 book ai didi

swift - 遍历数组的最后一个索引以外的所有索引

转载 作者:搜寻专家 更新时间:2023-10-30 22:09:29 25 4
gpt4 key购买 nike

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

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

很简单的东西。我希望能够获取我所在的索引,并且我希望 for 循环在 names.count == 0 时不运行。一次完成。

但似乎我在 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 i in 0...0 { }

我也喜欢无需显式设置索引即可遍历所有内容的想法:

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

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

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

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

与 Hamish 的回答相比,问题在于我只得到了当前名称的索引。这不允许我在不需要做类似的事情的情况下获得索引的值(value):

names[index + 1]

这只是需要跟踪的一个额外变量。我更喜欢 Hamish 的,它是:

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

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

最佳答案

一个选择是使用 dropLast()在阵列的 indices 上,允许您遍历除数组的最后一个索引之外的所有内容的 CountableRange

let names = ["Jim", "Jenny", "Earl"]

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

如果数组的元素少于两个,则不会进入循环。

另一种选择是 zip包含第一个元素已被删除的数组的数组,允许您迭代元素对及其后继元素:

for (nameA, nameB) in zip(names, names.dropFirst()) {
print("\(nameA) loves \(nameB)")
}

这利用了 zip 截断两个序列中较长的序列(如果它们的长度不相等)这一事实。因此,如果数组的元素少于两个,同样不会进入循环。

关于swift - 遍历数组的最后一个索引以外的所有索引,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40965049/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com