我可以在Swift中覆盖下标吗?

8 浏览
0 Comments

我可以在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

0
0 Comments

在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 }

}

}

0