ClosedRange< Int>.Index to Int in Swift?

i2byvkas  于 2023-08-02  发布在  Swift
关注(0)|答案(1)|浏览(109)

我的代码:

let range = 30...200 //ranges may have different bounds
let index = range.firstIndex(of: 55)

字符串
问题是index的类型为ClosedRange<Int>.Index,目前还不清楚如何将其转换为Int以供进一步使用。
我理解,将range转换为数组并在其中查找int索引是比较简单的,但他们应该允许使用ClosedRange<Int>.Index本身
注意:可能会有类似的问题,但都是关于如何将ClosedRange<Int>转换为数组,而不是索引转换

lx0bsm1f

lx0bsm1f1#

ClosedRange<Bound>.Index实际上只是一个枚举,它不会告诉你任何有用的信息。

enum Index {
    case inRange(Bound)
    case pastEnd
}

字符串
像这样简单的东西足以正确实现Collection和其他协议所需的索引相关方法。
如果55在范围内,firstIndex(of: 55)将返回inRange(55),否则返回pastEnd
另外请注意,firstIndexand other Collection methods)仅在Bound符合StridableStride符合SignedInteger时可用。毕竟,将ClosedRange<Double>ClosedRange<String>视为Collection是没有意义的。
因此,像firstIndex(of: 55)这样的操作有意义的唯一范围是当Bound: Stridable, Bound.Stride: SignedInteger。您可以使用distance(to: lowerBound)Stridable上的一个方法)找出这样一个范围内的元素的“数字”索引。

extension ClosedRange where Bound: Strideable, Bound.Stride: SignedInteger {
    func numericIndex(of element: Bound) -> Bound.Stride? {
        if contains(element) {
            return element.distance(to: lowerBound)
        } else {
            return nil
        }
    }
}


对于ClosedRange<Int>,这基本上是减法。55在30.200中的指数就是55 - 30 = 25。

相关问题