Arrays 从2D数组中获取列– ;如何限制扩展中的数组类型?
我想在Swift中扩展数组,以在二维数组的每个数组或列中返回单个元素。到目前为止,我已经:Arrays 从2D数组中获取列– ;如何限制扩展中的数组类型?,arrays,swift,Arrays,Swift,我想在Swift中扩展数组,以在二维数组的每个数组或列中返回单个元素。到目前为止,我已经: extension Array where // what goes here? func getColumn( column: Int ) -> [ Int ] { return self.map { $0[ column ] } } } 我相信我需要在where之后指定一个2D数组,但我一直无法找到正确的方法 在where后面指定2D数组的正确语法是什么? 我还
extension Array where // what goes here?
func getColumn( column: Int ) -> [ Int ] {
return self.map { $0[ column ] }
}
}
我相信我需要在where
之后指定一个2D数组,但我一直无法找到正确的方法
在where
后面指定2D数组的正确语法是什么?
我还很好奇,是否有一个好的文档说明如何指定扩展中where
之后可用的内容。我当时找不到
提前感谢。您需要约束数组的
元素
类型。下标方法在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 ] }
}
}
我对标题做了一些更改,以便在此处重定向有关检索数组列的其他问题。Swift 3:CollectionType替换为Collection,Generator是迭代器,因此我们有:扩展数组,其中元素:Collection{func getColumn(column:Element.Index)->[Element.Iterator.Element]{return self.map{$0[column]}}}1.对于Swift4,您是否需要将
生成器
更新为迭代器
?2.用外行术语,您能否告诉我->Element
不工作的原因,以及您需要执行的操作->[Element.Iterator.Element]
?因为如果我执行->Element
操作,我会得到以下错误:无法转换'[Element.Element]类型的返回表达式'返回类型'Element'@Honey:Swift 3版本也应该在Swift 4中工作。它在Xcode 9.4.1上不能为我编译。我得到以下错误:'Array.Element'没有名为'Generator'的成员类型;你是说'Generator'?&'Generator'已重命名为'Iterator',可以回答我的另一个问题well@Honey字体你用t了吗他在回答的末尾提到了“Swift 3的更新”版本?