Swift 数组:带 IndexPath 的下标 - 无法改变
Swift Array: subscript with IndexPath - unable to mutate
我想向数组的数组添加扩展以检索具有 IndexPath 大小为 2:
的 Element
let array: [[String]] = ....
let indexPath = IndexPath(indexes: [0, 0])
let string = array[indexPath]
我在实现以下扩展时遇到错误无法通过下标分配下标是仅获取:
extension Array where Element : Collection, Element.Index == Int {
subscript(indexPath: IndexPath) -> Element.Iterator.Element {
get {
return self[indexPath.section][indexPath.item]
}
set {
self[indexPath.section][indexPath.item] = newValue
}
}
}
出现这种错误的原因是什么?如何向 下标 添加突变选项?
为了改变嵌套数组,你必须要求
Element : MutableCollection
而不是 Element : Collection
。
你还可以定义两个扩展名:一个只读下标为只读
集合,以及可变集合的读写下标:
extension Collection where Index == Int, Element : Collection, Element.Index == Int {
subscript(indexPath: IndexPath) -> Element.Iterator.Element {
return self[indexPath[0]][indexPath[1]]
}
}
extension MutableCollection where Index == Int, Element : MutableCollection, Element.Index == Int {
subscript(indexPath: IndexPath) -> Element.Iterator.Element {
get {
return self[indexPath[0]][indexPath[1]]
}
set {
self[indexPath[0]][indexPath[1]] = newValue
}
}
}
我想向数组的数组添加扩展以检索具有 IndexPath 大小为 2:
的Element
let array: [[String]] = ....
let indexPath = IndexPath(indexes: [0, 0])
let string = array[indexPath]
我在实现以下扩展时遇到错误无法通过下标分配下标是仅获取:
extension Array where Element : Collection, Element.Index == Int {
subscript(indexPath: IndexPath) -> Element.Iterator.Element {
get {
return self[indexPath.section][indexPath.item]
}
set {
self[indexPath.section][indexPath.item] = newValue
}
}
}
出现这种错误的原因是什么?如何向 下标 添加突变选项?
为了改变嵌套数组,你必须要求
Element : MutableCollection
而不是 Element : Collection
。
你还可以定义两个扩展名:一个只读下标为只读 集合,以及可变集合的读写下标:
extension Collection where Index == Int, Element : Collection, Element.Index == Int {
subscript(indexPath: IndexPath) -> Element.Iterator.Element {
return self[indexPath[0]][indexPath[1]]
}
}
extension MutableCollection where Index == Int, Element : MutableCollection, Element.Index == Int {
subscript(indexPath: IndexPath) -> Element.Iterator.Element {
get {
return self[indexPath[0]][indexPath[1]]
}
set {
self[indexPath[0]][indexPath[1]] = newValue
}
}
}