如何将对象转换为另一个对象

How to convert object into another object

我如何将对象 1 转换为具有附加属性的对象 2

class Object1 {
   var imageUrl: String
   var title: String
   var description: String
   var order: Int
}

class Object2 {
   var imageUrl: String
   var title: String
   var description: String
   var buttonTitle: String
   var pageType: OnboardingType
}

目前我正在尝试的是这个

var items: [Object1] = []

var items2: [Object2] = [] {
    return convertItems(items: items)
}

private func convertItems(items: [Object1]) -> [Object2] {
        var object2Item: [Object2] = []

        items.forEach { item in
            if item.order == 1 {
                object2Item.append(Object2(imageUrl: item.imageUrl, title: item.title, description: item.description, buttonTitle: nil, onboardingType: .hajj))
            } else if item.order == 2 {
                object2Item.append(Object2(imageUrl: item.imageUrl, title: item.title, description: item.description, buttonTitle: nil, onboardingType: .hajj))
            } else if item.order == 3 {
                object2Item.append(Object2(imageUrl: item.imageUrl, title: item.title, description: item.description, buttonTitle: "some text".localized, onboardingType: .hajj))
            }
            
        }
      return object2Item
    }

我在另一个带有协议 的 Whosebug post 中看到了这一点,但是如果我将协议用作对象类型

,我将无法获得额外的属性

你的问题被标记为[oop],所以我会从那个角度回答。

您应该避免将对象视为愚蠢的数据组,这不是 OOP 的目的。将相关字段聚合成某种记录的做法早于 OOP 几十年。 OOP 是关于多态性的:让对象以不同的方式响应相同的消息,这样对象的所有用户就不必手动检查其类型。我还没有在您的示例中看到任何可以从多态性中获益的东西。

对象旨在为事物建模。我不知道你在这个例子中建模的是什么(Object1Object2 并没有真正传达太多意图,如果你明白我的意思)。

此处“正确”的 OOP 解决方案是根据对象建模的对象来命名对象。如果您需要对从一件事到另一件事的转换建模,那么该转换应该有一个受业务领域启发的名称。例如,SalesLead 对象可能会通过 saleCompleted 方法变成 CustomerObject。或者 DownloadingFile 可能有 downloadeCompleted 方法 returns 和 File。等等

如果您为您的问题提供更多背景信息,我可以使这个建议更加量身定制,但现在,我会从以下内容开始:

extension Object1 {
    init(from object1: Object) { // FIXME: Give a meaningful name
        let buttonTitle: String?

        switch object1.order {
        case 1, 2: buttonTitle = nil
        case 3: buttonTitle = "some text".localized
        default: fatalError("Not implemented")
        }

        self.init(
            imageUrl: object1.imageUrl,
            title: object1.title,
            description: object1.description,
            buttonTitle: buttonTitle,
            pageType: .hajj,
        )
    }
}

private func convertItems(items: [Object1]) -> [Object2] { // FIXME: Give a meaningful name
    items.map(Object2.init(from:))
}