如果您需要此语法,则可以扩展 RandomAccessCollection
并实现一个下标,该下标从数组返回一个可选值:
extension RandomAccessCollection {
subscript(index: Index) -> Element? {
self.indices.contains(index) ? (self[index] as Element) : nil
}
}
通过这种方式,您可以像这样做:
let arr = ["a", "b", "c"]
print(arr[99] ?? "not existing") // "not existing"
要小心确保在上下文中推断出 Optional
类型,例如使用 ??
或可选链式调用 arr[99]?.prop
,否则以下代码将仍然表现正常,即会导致 索引超出范围
错误:
let v = arr[99] // error
或者,您可以定义一个带有默认值的下标(就像Dictionary
一样):
extension RandomAccessCollection {
subscript(index: Index, default defaultValue: @autoclosure () -> Element) -> Element {
self.indices.contains(index) ? self[index] : defaultValue()
}
}
let arr = [1,2,3]
print(arr[9, default: 99]) // 99