我想在Swift中扩展Array,以返回每个数组或列中的单个元素,用于2D数组.到目前为止,我有:
extension Array where // what goes here?
func getColumn( column: Int ) -> [ Int ] {
return self.map { $0[ column ] }
}
}
Run Code Online (Sandbox Code Playgroud)
我相信我需要以某种方式指定一个2D数组where,但我一直无法弄清楚这样做的正确方法.
在where?之后指定2D数组的正确语法是什么?
我也很好奇是否有一个很好的文档,说明如何指定where延长生命中可用的内容.我在Apple的Swift扩展文档中找不到它
提前致谢.
Mar*_*n R 12
您需要约束Element数组的类型.下标方法在CollectionType协议中定义:
public protocol CollectionType : Indexable, SequenceType {
// ...
public subscript (position: Self.Index) -> Self.Generator.Element { get }
// ...
}
Run Code Online (Sandbox Code Playgroud)
因此,您可以为其元素为集合的数组定义扩展方法:
extension Array where Element : CollectionType {
func getColumn(column : Element.Index) -> [ Element.Generator.Element ] {
return self.map { $0[ column ] }
}
}
Run Code Online (Sandbox Code Playgroud)
例:
let a = [[1, 2, 3], [4, 5, 6]]
let c = a.getColumn(1)
print(c) // [2, 5]
Run Code Online (Sandbox Code Playgroud)
您甚至可以将其定义为附加的下标方法:
extension Array where Element : CollectionType {
subscript(column column : Element.Index) -> [ Element.Generator.Element ] {
return map { $0[ column ] }
}
}
let a = [["a", "b", "c"], [ "d", "e", "f" ]]
let c = a[column: 2]
print(c) // ["c", "f"]
Run Code Online (Sandbox Code Playgroud)
Swift 3更新:
extension Array where Element : Collection {
func getColumn(column : Element.Index) -> [ Element.Iterator.Element ] {
return self.map { $0[ column ] }
}
}
Run Code Online (Sandbox Code Playgroud)
或作为下标:
extension Array where Element : Collection {
subscript(column column : Element.Index) -> [ Element.Iterator.Element ] {
return map { $0[ column ] }
}
}
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
1298 次 |
| 最近记录: |