如何在Swift中获取数组中倒数第二个元素?

4

我只需要倒数第二个元素,而不是最后两个元素,如下:

let streets = ["Adams", "Bryant", "Channing", "Douglas", "Evarts"]
let penultimate = streets.suffix(2)
print(penultimate) // ["Douglas", "Evarts"]

此外,我不想使用语法streets[3],因为数组正在持续填充条目。

4
让我们定义一个penultimate变量,它的值是去掉最后一个元素后的streets数组中的最后一个元素。 - rmaddy
2
我想知道是谁投票将这个问题标记为不清楚。顺便说一句,在要求澄清之前,没有必要对其进行投票否定。提问者是一个新的贡献者,请友善对待,并查看行为准则。https://stackoverflow.com/conduct - Leo Dabus
@LeoDabus的问题不太清楚,因为提问者似乎知道suffix,在这种情况下他也应该知道first。顺便说一句,虽然我同意关闭投票的人,但并不是我投的。 - Cristik
@Cristik 后缀优先不起作用 - Leo Dabus
谢谢大家的评论。非常感谢您的帮助。是的,我是一个新的贡献者。我将尝试在未来更清楚地提出问题。在这种情况下,我能做得更好吗? - J Musy
1
在这种情况下,你应该始终展示你尝试过的内容,比如streets[streets.count-2]以及你所遇到的问题(我的先前示例对于少于2个元素的数组是无效的)。另外,你可以参考以下链接了解更多信息:https://meta.stackexchange.com/questions/5234/how-does-accepting-an-answer-work 和 https://stackoverflow.com/help/someone-answers - Leo Dabus
3个回答

6
您可以简单地删除您的集合中的最后一个元素,并返回结果的最后一个元素:
extension BidirectionalCollection {
    var elementBeforeLast: Element? {
        return dropLast().last
    }
}

使用方法:


if let elementBeforeLast = streets.elementBeforeLast {
    print(elementBeforeLast)  // "Douglas"
}

3

刚刚写了一个扩展

extension Array {
  func penultimate() -> Element? {
      if self.count < 2 {
          return nil
      }
      let index = self.count - 2
      return self[index]
  }
}

您可以像这样使用它

yourArr.penultimate()

这是一个Playground示例,它按预期工作

playground


0
这是关于一个Collection的解决方案。
public extension Collection {
    @inlinable
    var penultimate: Element? {
        guard let index = index(endIndex, offsetBy: -2, limitedBy: startIndex) else {
            return nil
        }
        return self[index]
    }
}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接