我在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下标?
答案 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
的字典。