微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

如何从 ClosedRange.SubSequence 中删除 Slice<>?

如何解决如何从 ClosedRange.SubSequence 中删除 Slice<>?

我正在使用 chunked method in Swift Algorithms

当我处理 Range 时,处理结果类型非常容易:

let range: Range<Int> = 0..<5
let subRangesIntermediary: [Range<Int>.SubSequence] = range.chunked(on: { $0 / 2 })
assert(Range<Int>.SubSequence.self == Range<Int>.self)

let subRanges: [Range<Int>] = subRangesIntermediary
assert(subRanges == [0..<2,2..<4,4..<5])

那是因为 Range<Int>.SubSequence == Range<Int> 所以在两者之间转换很容易。

当我尝试用 ClosedRange 做同样的事情时,我遇到了问题:

let closedRange: ClosedRange<Int> = 0...4
let subClosedRangesIntermediary: [ClosedRange<Int>.SubSequence] = closedRange.chunked(on: { $0 / 2})
let subClosedRangesIntermediary2: [Slice<ClosedRange<Int>>] = subClosedRangesIntermediary
// assert(subClosedRangesIntermediary2 == [0...1,2...3,4...4]) // ❌ Binary operator '==' cannot be applied to operands of type '[Slice<ClosedRange<Int>>]' and 'ArraySlice<ClosedRange<Int>>'

那是因为ClosedRange<Int>.SubSequence == Slice<ClosedRange<Int>>

我想删除 Slice,以便留下一个 ClosedRange 数组。

我想出了一种手动完成的方法,但这看起来需要做很多工作:

let subClosedRanges: [ClosedRange<Int>] = subClosedRangesIntermediary2.map {
  let start = closedRange[$0.startIndex]
  let end = closedRange[$0.index(before: $0.endindex)]
  return start...end
}
assert(subClosedRanges == [0...1,4...4])

我希望有一种方法可以执行以下操作:

let subClosedRanges: [ClosedRange<Int>] = subClosedRangesIntermediary2.map { $0.valueInBase }

或:

// Similar to how we can use Array(slice) on ArraySlice:
let subClosedRanges: [ClosedRange<Int>] = subClosedRangesIntermediary2.map { ClosedRange($0) }

我找不到 Slice 的类似内容

如何将 Slice<ClosedRange<T>> 转换为 ClosedRange<T>

解决方法

除非有更权威的答案,这里有一个解决方法:

extension ClosedRange where Bound: Strideable,Bound.Stride: SignedInteger {
  init(_ slice: Slice<Self>) {
    let lower = slice.base[slice.startIndex]
    let upper = slice.base[slice.index(before: slice.endIndex)]
    self.init(uncheckedBounds: (lower: lower,upper: upper))
  }
}

用法:

let subClosedRanges: [ClosedRange<Int>] = subClosedRangesIntermediary2.map { ClosedRange($0) }

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。