Swift 数组中数组的通用扩展
Swift generic extension for an array in array
我想定义 Array(或 Sequence 或 Collector?)的扩展,以便我可以使用 NSIndexPath 查询自定义对象列表的列表,并根据 indexPath 的部分和行获取对象。
public var tableViewData = [[MyCellData]]() // Populated elsewhere
public func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
var tableViewCellData = tableViewData.data(from: indexPath)
// use tableViewCellData
}
// This does not compile as I want the return type to be that of which is the type "in the list in the list" (i.e. MyCellData)
extension Sequence<T> where Iterator.Element:Sequence, Iterator.Element.Element:T {
func object(from indexPath: NSIndexPath) -> T {
return self[indexPath.section][indexPath.row]
}
}
- A
Sequence
不能通过下标索引,所以你需要一个
Collection
.
- collections 元素也必须是 collections。
- 由于
.row
、.section
是 Int
,因此 collection
其嵌套的 collection 必须由 Int
索引。
(许多 collection 都是这种情况,例如数组或数组切片。
String.CharacterView
是 collection 的一个例子,它是 而不是
由 Int
索引。)
- 您不需要任何通用占位符(并且
extension Sequence<T>
Swift 3 语法无效)。只需将 return 类型指定为
嵌套的元素类型 collection.
综合起来:
extension Collection where Index == Int, Iterator.Element: Collection, Iterator.Element.Index == Int {
func object(from indexPath: IndexPath) -> Iterator.Element.Iterator.Element {
return self[indexPath.section][indexPath.row]
}
}
我想定义 Array(或 Sequence 或 Collector?)的扩展,以便我可以使用 NSIndexPath 查询自定义对象列表的列表,并根据 indexPath 的部分和行获取对象。
public var tableViewData = [[MyCellData]]() // Populated elsewhere
public func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
var tableViewCellData = tableViewData.data(from: indexPath)
// use tableViewCellData
}
// This does not compile as I want the return type to be that of which is the type "in the list in the list" (i.e. MyCellData)
extension Sequence<T> where Iterator.Element:Sequence, Iterator.Element.Element:T {
func object(from indexPath: NSIndexPath) -> T {
return self[indexPath.section][indexPath.row]
}
}
- A
Sequence
不能通过下标索引,所以你需要一个Collection
. - collections 元素也必须是 collections。
- 由于
.row
、.section
是Int
,因此 collection 其嵌套的 collection 必须由Int
索引。 (许多 collection 都是这种情况,例如数组或数组切片。String.CharacterView
是 collection 的一个例子,它是 而不是 由Int
索引。) - 您不需要任何通用占位符(并且
extension Sequence<T>
Swift 3 语法无效)。只需将 return 类型指定为 嵌套的元素类型 collection.
综合起来:
extension Collection where Index == Int, Iterator.Element: Collection, Iterator.Element.Index == Int {
func object(from indexPath: IndexPath) -> Iterator.Element.Iterator.Element {
return self[indexPath.section][indexPath.row]
}
}