【问题标题】:Extend CollectionType add indexOutOfRange function扩展 CollectionType 添加 indexOutOfRange 函数
【发布时间】:2015-07-01 16:45:04
【问题描述】:

我正在尝试添加一个函数来告诉我索引是否超出了数组的范围。

CollectionType 的 startIndex 和 endIndex 似乎是通用的,所以我试图仅在索引类型为 Int 时限制扩展。 此代码无法编译:

extension CollectionType where Index.Type is Int {
    public func psoIndexOutOfRange(index: Index.Type) -> Bool{
        return index < self.startIndex || index > self.endIndex
    }
}

有可能吗?以及添加它的正确方法是什么。

【问题讨论】:

标签: swift swift2


【解决方案1】:

我个人认为这会更好地作为Range 的扩展,而不是CollectionType

extension Range where T: Comparable {
    func contains(element: Generator.Element) -> Bool {
        return element >= startIndex && element < endIndex
    }
}

您可以这样调用(indices 返回从集合开始到结束索引的范围):

[1,2,3].indices.contains(2)

注意,CollectionTypeRange 符合)已经有一个contains 方法——但通过线性搜索完成。这会重载 contains 的范围,以便在恒定时间内完成。

此外,如果您这样做是为了将其与下标提取结合起来,请考虑添加一个可选的提取以使事情变得更容易:

extension CollectionType where Index: Comparable {
    subscript(safe idx: Index) -> Generator.Element? {
        guard indices.contains(idx) else { return nil }
        return self[idx]
    }
}

let a = [1,2,3]
a[safe: 4]  // nil

【讨论】:

  • 这很好,但是有一个问题,为什么要检查 element
  • 否 - endIndex 是一个“哨兵值”,一个假值,表示您已经超过了最后一个有效索引。所以对于数组[1,2,3]endIndex 将是 3。
【解决方案2】:

怎么样:

extension CollectionType where Index: Comparable {
    public func psoIndexOutOfRange(index: Index) -> Bool{
        return index < self.startIndex || index >= self.endIndex
    }
}

正如@MartinR 建议的那样,如果您使用Comparable 而不是将Index 限制为Int 类型,则更为通用。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-05-14
    • 1970-01-01
    • 1970-01-01
    • 2019-05-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多