我想在Swift中扩展Array,以在2D数组的每个数组或列中返回单个元素。到目前为止,我有:
extension Array where // what goes here? func getColumn( column: Int ) -> [ Int ] { return self.map { $0[ column ] } } }
我相信我需要在之后指定2D数组where,但是我一直无法找出正确的方法。
where
在where?之后指定2D数组的正确语法是什么?
我也很好奇,如果有很好的文档说明如何指定where扩展后的可用内容。我在Apple的Swift扩展文档中找不到
提前致谢。
您需要限制Element数组的类型。下标方法在CollectionType协议中定义:
Element
CollectionType
public protocol CollectionType : Indexable, SequenceType { // ... public subscript (position: Self.Index) -> Self.Generator.Element { get } // ... }
因此,您可以为元素为集合的数组定义扩展方法:
extension Array where Element : CollectionType { func getColumn(column : Element.Index) -> [ Element.Generator.Element ] { return self.map { $0[ column ] } } }
例:
let a = [[1, 2, 3], [4, 5, 6]] let c = a.getColumn(1) print(c) // [2, 5]
您甚至可以将其定义为其他下标方法:
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"]
Swift 3 更新 :
extension Array where Element : Collection { func getColumn(column : Element.Index) -> [ Element.Iterator.Element ] { return self.map { $0[ column ] } } }
或作为下标:
extension Array where Element : Collection { subscript(column column : Element.Index) -> [ Element.Iterator.Element ] { return map { $0[ column ] } } }