swift - 复制一个结构对象
问题描述
我必须非常相似的结构对象。但一个包含比另一个更多的值。由于 KituraKuery 方法需要初始值,因此我无法修改它,但需要更多信息以供将来处理。
我现在的问题是,这些结构对象看起来像这样:
struct provider: Codable {
var firstName: String?
var lastName: String?
var email:String?
}
extension provider: Model{
class Persistence {}
}
struct provider2: Codable {
var firstName: String?
var lastName: String?
var email:String?
var providerCategories: [categories]?
}
extension provider: Model{
class Persistence {}
}
我需要的基本上是将信息从提供者复制到提供者2 的更智能的方法。
我现在所做的是我向 provider2 提供了一个 init,将 provider 作为输入并将所有值添加到它。
struct provider2: Codable {
var firstName: String?
var lastName: String?
var email:String?
var providerCategories: [categories]?
init(provider: provider?) {
if let provider = provider{
firstName = provider.firstName
lastName = provider.lastName
email = provider.lastName
}
}
extension provider: Model{
class Persistence {}
}
然而,我相信这可能是最糟糕的方式,并且有更好和更精简的方法。
我在协议上尝试了自己,但它不能真正发挥作用。
任何输入都会很棒:)
解决方案
在您的方法中,Provider 和 Provider2 结构彼此紧密耦合。所以让我们说,如果你想改变 Provider 结构或者你想用另一个结构初始化 Provider2 结构,那么你需要改变很多东西。我们可以通过解耦 Provider 和 Provider2 结构轻松解决问题
protocol BasicInfo {
var firstName: String? { get set }
var lastName: String? { get set }
var email:String? { get set }
}
protocol Address {
var address: String? {get set}
}
struct Provider: BasicInfo {
var firstName: String?
var lastName: String?
var email: String?
}
struct Provider2: BasicInfo, Address {
var firstName: String?
var lastName: String?
var email:String?
var address: String?
init(basic: BasicInfo, add: String) {
firstName = basic.firstName
lastName = basic.lastName
email = basic.email
address = add
}
}
//Below are instances of respective struct
let provider1 = Provider(firstName: "Test1", lastName: "TestLast1", email: "test1@gmail.com")
var provider2 = Provider2(basic: provider1, add: "Germany")
在上面的代码中,我有两个不同的 Struct Provider 和 Provider2。Provider2 包含比 Provider 更多的变量(我刚刚添加了一个 var 来演示)。现在假设将来我们不需要 Provider 填充 Provider2,我们有一个新的 struct Provider3 将填充 Provider2 值。
struct Provider3: BasicInfo {
var firstName: String?
var lastName: String?
var email: String?
var middleName: String? //new property added
}
//Below are instances of respective struct
let provider3 = Provider3(firstName: "Test1", lastName: "TestLast1", email: "test1@gmail.com")
var provider2 = Provider2(basic: provider3, add: "Germany")
如您所见,struct Provider2 没有任何变化,我们只是引入了一个新结构,创建新结构的实例并将该实例传递给 Provider2 的 init 方法。
推荐阅读
- android - In Android Studio, why do I have to click 'run app' twice in the emulator to start the app?
- php - 保存通过 API 在 rawFile(blob) 中从 React 检索到的 jpeg
- c# - 意外标记:StartObject,使用自定义转换器反序列化 OneOf 联合类型时
- mongodb - 如何摆脱在 mongodb 中插入嵌套结构时添加的附加键
- c# - 包含起始字符串的正则表达式
- python - 为什么在 IIS 上对我的 Flask 应用程序的更改会延迟(文本、表单等 html 内容)?
- html - 缩放时图像渲染变化
- ios - 在过渡期间视图不更新
- ffmpeg - 如何在没有中间文件的情况下将 Csound 输出传输到 ffmpeg 进行转换?
- python - TensorFlow Federated:如何调整联合数据集中的非独立同分布?