2016-07-13 43 views
1

我想在任何两个符合相同协议的对象之间进行映射。这将是方便的通过功能与签名可以这样做:Swift在协议一致性类型之间的映射

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类符合其各自的协议,我想将它们映射到不可变的结构类型。

一个例子是:

/** 
    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 
} 

我想能够有一个通用的函数或方法,用以映射FoodEntityFoodProduct而无需手动执行类似:

FoodProduct(name: entity.name, weight: entity.weight, price: entity.price)

如果可以做到这一点,该怎么办?

+0

你的问题很混乱。请编辑。 –

+0

这可能有助于开始:http://stackoverflow.com/a/24069875/3141234 – Alexander

回答

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 & 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 
     } 
    }