首页 > 解决方案 > 复制一个结构对象

问题描述

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

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

我在协议上尝试了自己,但它不能真正发挥作用。

任何输入都会很棒:)

标签: swiftstruct

解决方案


在您的方法中,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 方法。


推荐阅读