gpt4 book ai didi

swift - 复制一个结构体对象

转载 作者:行者123 更新时间:2023-11-30 10:37:04 28 4
gpt4 key购买 nike

我必须非常相似的结构对象。但其中一个比另一个包含更多的值。由于 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 {}
}

然而,我相信这可能是最糟糕的方法,并且有更好、更精益的方法。

我自己尝试了协议(protocol),但是这并不能真正发挥作用。

任何输入都会很棒:)

最佳答案

在您的方法中,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 更多的变量(我刚刚添加了一个变量来演示)。现在假设将来我们不需要 Provider 来填充 Provider2,我们有一个新的结构体 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 方法。

关于swift - 复制一个结构体对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57743914/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com