You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.21 09:13:27