我想在符合相同协议的任何两个对象之间进行映射。通过带签名的函数可以很方便:
func mapFrom<T>(objectA: T, to inout objectB: T)
尽管如此(对于不可变类型)更好的是将它放在以下形式中:
func map<T, U: T>(from source: T) -> U
以某种方式它可以从U
中的值初始化T
对象。
我想通过Swift Reflection而不是使用Objective-C
运行时来做这件事,但如果这是唯一的方法,我会满足于此。如果不知何故可以在没有反思的情况下完成,那将是惊人的,但我不知道如何。
我想这样做的原因是因为我有可变的Realm类,它们符合各自的协议,我想将它们映射到不可变的struct类型。
一个例子是:
/**
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(name: entity.name, weight: entity.weight, price: entity.price)
如果可以完成,怎么办呢?
答案 0 :(得分:0)
我认为你正在寻找类似的东西。
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
}
事情是,没有通用的方法来做到这一点。因为您必须指定name
,weight
&amp;的值。不知何故price
。我认为这是你能得到的最接近的。
或者你可以做这样的事情。
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
}
}