我有一个包含几个字段的结构数组。我想映射数组以创建另一个包含字段子集的结构
struct History: {
let field1: String
let field2: String
let field3: String
let field4: String
}
struct SubHistory: {
let field1: String
let field2: String
}
我可以使用for循环。但是也许可以使用地图,不是吗?
答案 0 :(得分:5)
是的,您可以通过以下方式使用map
:
let histories: [History] // array of History structs
let subHistories = histories.map { SubHistory(field1: $0.field1, field2: $0.field2) }
答案 1 :(得分:4)
作为kiwisip's correct answer的一个细微变化:我建议将“根据历史记录创建子历史记录”的逻辑放入自定义初始化程序中:
extension SubHistory {
init(history: History) {
self.init(field1: history.field1, field2: history.field2)
}
}
然后映射可以简单地完成
let histories: [History] = ...
let subHistories = histories.map(SubHistory.init)
将初始化程序放入扩展名具有以下优点:默认的逐成员初始化程序仍然可以合成-此观察的归因于@kiwisip!
答案 2 :(得分:1)
是的,只要您拥有Array
或实现Collection
协议的任何类型,其中map
is defined,就可以使用map
将[A]
转换为[B]
。
kiwisip已经给出了很好的答案,而Martin R则提出了一个不错的选择。
这是另一个。
extension History {
var subHistory: SubHistory {
return SubHistory(field1: field1, field2: field2)
}
}
// use it like
let histories: [History] = [...]
let subHistories = histories.map { $0.subHistory }