【问题标题】:Get array elements that fall into a range without error获取无错误范围内的数组元素
【发布时间】:2019-12-14 12:02:20
【问题描述】:

如果超出范围,是否可以通过切片获取数组的元素?例如:

var array = [0,1,2,3,4]
print(array[3...100])

有什么方法可以得到[3,4]?我只需要属于该范围的部分。例如,在 Python 中,我可以创建一个数组 [3: 100] 并获取落入此范围内的元素而不会出错。也许在 swift 中有一个类似物?

【问题讨论】:

  • print(array.filter { 3...100 ~= $0 })
  • print(array[3...min(100, array.endIndex - 1)])
  • @vacawama 这假定数组至少有 4 个项目。
  • @LeoDabus,这是正确的,否则 boom。顺便说一句,当 OP 真正询问索引时,您的评论正在过滤值。
  • 我已经意识到了

标签: arrays swift slice


【解决方案1】:

您可以通过将初始范围 (3...100) 限制到数组的索引来做到这一点。但是,这不适用于 ClosedRanges (...),仅适用于 Ranges

  • 您可以使用Range(3...100) 转换为Range,或者
  • 您只需将ClosedRange 文字直接更改为Range3..<101
let array = [0,1,2,3,4]
print(array[(3..<101).clamped(to: array.indices)]) // => [3, 4]

如果你经常这样做,你应该为它做一个扩展:

extension Collection {
    subscript<R: RangeExpression>(allowingOutOfBoundsRange rangeExpression: R) -> Self.SubSequence
        where R.Bound == Self.Index, Self.Indices == Range<Self.Index> {
        let range = rangeExpression.relative(to: self)
        let clampedRange = range.clamped(to: self.indices)
        return self[clampedRange]
    }
}

不过,理想情况下,您应该首先避免尝试使用超出范围的索引进行索引。像3......3 等范围表达式可能会非常有助于减轻对此类内容的大部分需求。

【讨论】:

  • 我认为您没有理解这个问题。您正在将元素值与其索引混合。在我看来,OP 正在为 3 到 100 范围内的值寻找一个简单的过滤器
  • @LeoDabus 我将不再使用他提供的 python 表示法。 array[3:100]是python中的切片操作,不是过滤操作。
【解决方案2】:

因为 Swift 被设计为安全的,所以你需要注意你的代码可能会遇到一些问题,你可以在 swift 中做到这一点吗?

   var bound = 100

   if (array.count < 100) {
      bound = array.count
   }

   if (array.count >= 3) {
      print(array(3...bound))
   }

这就是语言的美妙之处,你不应该在不抛出错误的情况下做一些容易出错的事情。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-06-20
    • 1970-01-01
    • 2016-07-07
    • 1970-01-01
    • 2022-12-07
    • 2019-05-14
    • 2017-02-24
    相关资源
    最近更新 更多