我有一个Swift项目,在其中我对任何Collection类型都使用2个扩展。它们允许安全访问数组中的元素。这是扩展名:
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]
}
这很好用,但是在Xcode 10.2中现在存在编译器错误。
我试图尽可能明确地说明下标的类型和元素的类型,但这没有用。
有人知道为什么这不再起作用吗?
答案 0 :(得分:1)
我无法解释为什么这在以前的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测试)
第二个safe
最好用另一个词而不是subscript
,这两个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]
}
}
也许我需要澄清我的意图。 (感谢Nate。)
您可以将第二个下标设为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
声明使用不同的标签,以避免产生歧义。