Swift中如何基于已有Struct实例复用属性并自定义新属性初始化
复用Payload实例属性创建新实例的简便方法
你的需求是基于已有Payload实例的firstName、lastName、number属性,自定义address和gender来创建新实例,避免手动传递所有属性,以下是几种简便实现方式:
1. 扩展初始化方法
给Payload添加一个从已有实例初始化的构造器,支持可选自定义address和gender:
public struct Payload: Codable, CustomStringConvertible { // 原有属性、CodingKeys、初始化器保持不变 public init(from payload: Payload, address: String? = nil, gender: String? = nil) { self = payload if let address = address { self.address = address } if let gender = gender { self.gender = gender } Log.info("data: \(self)") } }
使用方式:
let secondPerson = Payload(from: firstPerson, address: "set address", gender: "set gender")
2. 添加链式修改方法
给Payload添加一个返回修改后新实例的方法,适合链式调用:
public struct Payload: Codable, CustomStringConvertible { // 原有属性、CodingKeys、初始化器保持不变 public func with(address: String? = nil, gender: String? = nil) -> Payload { var newPayload = self address.map { newPayload.address = $0 } gender.map { newPayload.gender = $0 } Log.info("data: \(newPayload)") return newPayload } }
使用方式:
let secondPerson = firstPerson.with(address: "set address", gender: "set gender")
3. 直接创建副本并修改属性
利用Swift结构体的值类型特性,直接复制实例后修改目标属性,这是最直观的方式:
var secondPerson = firstPerson secondPerson.address = "set address" secondPerson.gender = "set gender" Log.info("data: \(secondPerson)")
方法对比
- 初始化器方法:符合Swift构造器设计规范,语义清晰,适合需要明确初始化逻辑的场景。
- 链式修改方法:代码更简洁,支持链式调用多个修改操作。
- 直接修改副本:实现成本最低,无需额外添加方法/初始化器,适合简单的属性修改场景。
内容的提问来源于stack exchange,提问作者jacobcan118
相关产品推荐
相关产品推荐

