如何将对象转换为另一个对象
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 是关于多态性的:让对象以不同的方式响应相同的消息,这样对象的所有用户就不必手动检查其类型。我还没有在您的示例中看到任何可以从多态性中获益的东西。
对象旨在为事物建模。我不知道你在这个例子中建模的是什么(Object1
和 Object2
并没有真正传达太多意图,如果你明白我的意思)。
此处“正确”的 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:))
}
我如何将对象 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
}
我在另一个带有协议
你的问题被标记为[oop],所以我会从那个角度回答。
您应该避免将对象视为愚蠢的数据组,这不是 OOP 的目的。将相关字段聚合成某种记录的做法早于 OOP 几十年。 OOP 是关于多态性的:让对象以不同的方式响应相同的消息,这样对象的所有用户就不必手动检查其类型。我还没有在您的示例中看到任何可以从多态性中获益的东西。
对象旨在为事物建模。我不知道你在这个例子中建模的是什么(Object1
和 Object2
并没有真正传达太多意图,如果你明白我的意思)。
此处“正确”的 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:))
}