映射结构数组

时间:2019-02-21 08:13:31

标签: swift functional-programming

我有一个包含几个字段的结构数组。我想映射数组以创建另一个包含字段子集的结构

struct History: {
   let field1: String
   let field2: String
   let field3: String
   let field4: String
}

struct SubHistory: {
   let field1: String
   let field2: String
}

我可以使用for循环。但是也许可以使用地图,不是吗?

3 个答案:

答案 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 }