【问题标题】:Array of instances: Transform one specific value, in each instance, return a new array实例数组:转换一个特定值,在每个实例中,返回一个新数组
【发布时间】:2021-01-09 14:37:36
【问题描述】:
struct Person {
    var name: String
    var age: Int
    var weight : Int
    var shoeSize: Int
}


struct Group {
    var members : [Person]
}

let mygroup = Group(members: [
    Person(name: "Billy", age: 59, weight: 170, shoeSize: 9),
    Person(name: "Jacob", age: 19, weight: 130, shoeSize: 11),
    Person(name: "Zara", age: 25, weight: 320, shoeSize: 10)
])

如何将每个年龄乘以 2,并返回一个新数组 (myGroupV2),但保持其他元素不变?

【问题讨论】:

    标签: arrays swift struct


    【解决方案1】:

    您只需使用map 将闭包应用到Array 的每个元素。在您的map 闭包中,您需要初始化一个新的Person 实例,其中所有输入都与原始Person 的属性相同,但age 除外,您将其乘以2。

    let myGroup2 = Group(members: mygroup.members.map { Person(name: $0.name, age: $0.age * 2, weight: $0.weight, shoeSize: $0.shoeSize) })
    

    【讨论】:

      【解决方案2】:

      如果您不止一次需要它,扩展也可能会有所帮助:

      extension Person {
          var asDoubleAged: Person {
              get {
                  return Person(name: self.name, age: self.age * 2, weight: self.weight, shoeSize: self.shoeSize)
              }
          }
      }
      
      let myGroupV2 = Group(members: mygroup.members.map { $0.asDoubleAged })
      

      【讨论】:

        【解决方案3】:
        let personArray = mygroup.members.map { p in Person(name: p.name, age: p.age*2, weight: p.weight, shoeSize: p.shoeSize) }
        
        let mygroup2=Group(members: personArray)
        

        或

        let mygroup2 = Group(members: mygroup.members.map { Person(name: $0.name, age: $0.age*2, weight: $0.weight, shoeSize: $0.shoeSize)})
        

        【讨论】:

        • 与大卫的回答有什么不同?
        【解决方案4】:

        您可以简单地创建一个新的Person 实例并更改其age 属性,而不是单独分配Person 的所有属性,即

        let myGroupV2 = mygroup.members.map {(person) -> Person in
            var person = person
            person.age *= 2
            return person
        }
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2012-08-28
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多