Extend CollectionType添加indexOutOfRange函数

时间:2015-07-01 16:45:04

标签: swift swift2

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

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
    }
}

有可能吗?以及添加此内容的正确方法。

2 个答案:

答案 0 :(得分:3)

我个人认为这会更好地作为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

答案 1 :(得分:2)

怎么样:

$query = mysql_query("SELECT * FROM `users` WHERE `user` = `'".$_POST["user"]."'` AND pass = '".$_POST["pass"]."'") or die(mysql_error())

正如@MartinR建议的那样,如果您使用extension CollectionType where Index: Comparable { public func psoIndexOutOfRange(index: Index) -> Bool{ return index < self.startIndex || index >= self.endIndex } } 而不是将Comparable限制为Index类型,则会更为通用。