gpt4 book ai didi

swift - 在协议(protocol)符合类型之间映射 Swift

转载 作者:行者123 更新时间:2023-11-28 08:33:37 24 4
gpt4 key购买 nike

我想在符合相同协议(protocol)的任意两个对象之间进行映射。通过带有签名的函数这样做会很方便:

func mapFrom<T>(objectA: T, to inout objectB: T)

更好的是(对于不可变类型)采用以下形式:

func map<T, U: T>(from source: T) -> U

它可以从 T 中的值以某种方式初始化 U 对象。

我想通过 Swift 反射而不是使用 Objective-C 运行时来做到这一点,但如果这是唯一的方法,我会满足于此。如果以某种方式无需反射(reflection)就可以完成,那将是惊人的,但我不知道该怎么做。

我想这样做的原因是因为我有符合各自协议(protocol)的可变 Realm 类,我想将它们映射到不可变结构类型。

一个例子是:

/**
The protocol.
*/
protocol Food {
var name: String { get }
var weight: Float { get }
var price: Float { get }
}

/**
The mutable Realm class representation.
*/
final class FoodEntity: Object, Food {
dynamic var name = ""
dynamic var weight = 0.0
dynamic var price = 0.0
}

/**
The final struct I want to map to from the Realm representation.
*/
struct FoodProduct: Food {
let name: String
let weight: Float
let price: Float
}

我希望能够有一个通用的函数或方法来将 FoodEntity 映射到 FoodProduct 而无需手动执行以下操作:

FoodProduct(名称:entity.name,重量:entity.weight,价格:entity.price)

如果可以的话,如何做到这一点?

最佳答案

我认为您正在寻找这样的东西。

 func fetchAllFoodProducts() -> [FoodProduct]
{
var foodProducts : [FoodProduct] = []

// Fetch From Realm

let products = realm.objects(FoodEntity.self)

for product in products
{
foodProducts.append(FoodProduct(name: product.name, weight: product.weight, price: product.price))
}

return foodProducts
}

问题是没有一种通用的方法可以做到这一点。因为您必须以某种方式分配 nameweightprice 的值。我认为这是您能得到的最接近的值。

或者你可以这样做。

 func fetchAllFoodProducts() -> [FoodProduct]
{
var foodProducts : [FoodProduct] = []

// Fetch From Realm

let products = realm.objects(FoodEntity.self)

for product in products
{
foodProducts.append(FoodProduct(entity: product))
}

return foodProducts
}

稍微改变一下您的 FoodEntity

 struct FoodProduct: Food {
let name: String
let weight: Float
let price: Float

init(entity : FoodEntity)
{
self.name = entity.name
self.weight = entity.weight
self.price = entity.price
}
}

关于swift - 在协议(protocol)符合类型之间映射 Swift,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38357756/

24 4 0
文章推荐: html - 将 Bootstrap 与 Rails 结合使用 4. 为什么在
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com