加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

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

发布时间:2020-12-14 05:38:15 所属栏目:百科 来源:网络整理
导读:据我所知,在 Swift 3中,典型的C Style for循环有一些变化.我一直在努力解决这个问题,但在很多情况下我似乎写的代码比以前多.也许有人可以引导我朝着正确的方向前进,因为这就是我想要的: let names : [String] = ["Jim","Jenny","Earl"]for var i = 0; i nam
据我所知,在 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])
}

非常简单的东西.我喜欢能够得到我正在使用的索引,并且我喜欢for循环,如果names.count == 0,则不能运行.一气呵成.

但似乎我在Swift 3中的选择不允许我这样做.我必须做以下事情:

let names : [String] = ["Jim","Earl"]
if names.count > 0 {
    for i in 0...(names.count - 1) {
        NSLog("%@ loves %@",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的答案相比,这个问题是我只得到当前名称的索引.这不允许我在索引处获取值而不需要执行以下操作:

names[index + 1]

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

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

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

一种选择是在数组的 indices上使用 dropLast(),允许您迭代除了数组的最后一个索引之外的所有数据的CountableRange.
let names = ["Jim","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)")
}

这利用了如果两个序列的长度不相等,则截断两个序列中较长的序列的事实.因此,如果数组少于两个元素,则不会再输入循环.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读