我可以在Swift中覆盖下标吗?
我可以在Swift中覆盖下标吗?
我想在Swift中进行有效性检查,并返回数组中的适当值,就像下面的函数objectFromArr(at:)一样。\nvar arr = [10, 20, 30, 40]\nfunc objectFromArr(at: Int) -> Int? {\n return at < 0 || at >= arr.count ? nil : arr[at]\n}\n
\n我不想使用函数,因为Swift数组通常使用下标来获取对象。\n所以,我希望如果可能的话重写下标。\noverride @inlinable public subscript(index: Int) -> Element?\n
在Swift中,无法覆盖现有的下标操作符(subscript),原因有两个:
1. 结构体(struct)不支持继承和方法重写。
2. 即使支持,这样做也会破坏现有的代码,现有代码不会期望结果是可选的。
解决方法是定义一个新的扩展(extension),如下所示:
extension Collection {
subscript(safelyAccess index: Index) -> Element? {
get { return self.indices.contains(index) ? self[index] : nil }
}
}
let a = [1, 2, 3]
print(a[safelyAccess: 99]) // => nil
感谢Alexander的回答,我之前不知道可以在下标操作符的参数中使用参数名。
太棒了!你还可以在类中使用这种方法,如下所示:
class MyClass: NSObject, Sequence {
private var _array: [DisplayedEntry] = []
subscript(index: Int) -> DisplayedEntry? {
get { return self._etfEntries.indices.contains(index) ? self._etfEntries[index] : nil }
}
}