我无法解释为什么这在以前版本的 Xcode 中确实有效,但你不认为你的两个 subscript(safe:) 在 Collection.Index == Int 时足够模棱两可吗?
而且,对于您的第二个subscript(safe:),safe 这个词似乎不合适,因为当int 超出集合范围时,它可能很容易使您的应用崩溃。
extension Collection {
subscript (safe index: Index) -> Element? {
return indices.contains(index) ? self[index] : nil
}
subscript (safe int: Int) -> Element? {
let index = self.index(self.startIndex, offsetBy: int)
return self[index]
}
}
var arr: [String] = ["a"]
print(arr[safe: 1])
导致Thread 1: Fatal error: Index out of range上线return self[index]。
(使用 Xcode 10.1 测试。)
第二个subscript 最好使用除safe 之外的另一个词,而这两个subscript 在任何版本的Xcode 中都不会有歧义。
extension Collection {
subscript (safe index: Index) -> Element? {
return indices.contains(index) ? self[index] : nil
}
subscript (offsetBy int: Int) -> Element? {
let index = self.index(self.startIndex, offsetBy: int)
return self[index]
}
}
也许我需要澄清我的意图。 (感谢内特。)
您可以将第二个下标设为safe:
extension Collection {
subscript (safe index: Index) -> Element? {
return indices.contains(index) ? self[index] : nil
}
subscript (offsetBy int: Int) -> Element? {
let index = self.index(self.startIndex, offsetBy: int)
return self[safe: index]
}
}
即使在这种情况下,您最好为两个 subscript 声明使用不同的标签以避免歧义。