在同一扩展名中调用时,集合扩展名不可见?

时间:2017-02-08 23:28:54

标签: swift

我在Collection上使用以下扩展名:

extension Collection where Indices.Iterator.Element == Index {

    subscript (safe index: Index) -> Generator.Element? {
        return indices.contains(index) ? self[index] : nil
    }

}

我想在另一个Collection扩展中找到的函数中使用它,如下所示:

extension Collection {

    func tesFunc() -> String? {

        let s = [safe:1]

        return nil
    }
}

我无法完成这项工作。我得到的错误是: “使用未解决的标识符'safe'

如何使用Collection上第二个扩展名中找到的函数中的save下标?

Error as shown in a Playground

1 个答案:

答案 0 :(得分:1)

好问题。我的初步答案是完全错误的,你可以这样做。

问题是您已使用Collection限制了初始where Indices.Iterator.Element == Index扩展名,但第二个扩展名不受约束。您必须对两者应用相同的约束。这没关系:

extension Collection where Indices.Iterator.Element == Index {
    subscript (safe index: Index) -> Generator.Element? {
        return indices.contains(index) ? self[index] : nil
    }
}

extension Collection where Indices.Iterator.Element == Index {
    func testFunc(index: Index) -> String? {
        let _ = self[safe: index]
        return nil
    }
}


let a = [1,2,3,4,5]

a[safe: 0] // 1
a[safe: 7] // nil

请注意testFunc()self中使用self[safe: index]。这是强制性的。否则,编译器会认为您正在尝试创建一个密钥为safe且无法解析safe的字典。