我可以快速覆盖下标吗? [重复]

问题描述 投票:0回答:1

此问题已经在这里有了答案:

我想进行有效性检查并迅速在数组中返回适当的值,例如下面的函数objectFromArr(at:)。

var arr = [10, 20, 30, 40]

func objectFromArr(at: Int) -> Int? {
    return at < 0 || at >= arr.count ? nil : arr[at]
}

我不想使用功能。由于快速,Array通常使用下标来获取对象。因此,如果可能的话,我想覆盖下标。

@inlinable public subscript(index: Int) -> Element

to

override @inlinable public subscript(index: Int) -> Element?
arrays swift overriding subscript
1个回答
1
投票

您不能覆盖现有的下标,有两个原因:

  1. 结构不支持继承,方法重写,句点
  2. 即使他们这样做,也会破坏现有代码,不会期望结果是可选的。

相反,只需定义一个新的扩展名:

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
© www.soinside.com 2019 - 2024. All rights reserved.