首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何从ClosedRange.SubSequence中删除Slice<>?

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

Stack Overflow用户
提问于 2021-05-09 01:32:38
回答 1查看 41关注 0票数 1

我在用chunked method in Swift Algorithms

当我处理范围时,很容易处理结果类型:

代码语言:javascript
复制
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做同样的事情时,我遇到了问题:

代码语言:javascript
复制
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>>

我希望删除切片,这样就只剩下一个ClosedRange数组。

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

代码语言:javascript
复制
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, 2...3, 4...4])

我希望有一种方法可以做下面这样的事情:

代码语言:javascript
复制
let subClosedRanges: [ClosedRange<Int>] = subClosedRangesIntermediary2.map { $0.valueInBase }

或者:

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

我在Slice上找不到这样的东西。

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

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2021-05-09 02:34:04

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

代码语言:javascript
复制
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))
  }
}

用法:

代码语言:javascript
复制
let subClosedRanges: [ClosedRange<Int>] = subClosedRangesIntermediary2.map { ClosedRange($0) }
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/67450369

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档