2016-07-13 7 views
1

同じプロトコルに準拠する任意の2つのオブジェクトの間でマップしたいと思う。署名を使用して機能を経由してこれを行うに便利である。さらに良いプロトコル準拠タイプ間のSwiftでのマッピング

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

けれども(不変のタイプの)形でそれを持っているだろう:

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

それが初期化することができ何とかa Uオブジェクトの値はTです。

実行時間をObjective-CではなくSwift Reflectionで実行したいと考えていますが、それが唯一の方法だった場合は解決します。どういうわけか、それは驚くべきことではない反省を伴って行われる可能性がありますが、私はどのように見えません。

私がこれをやりたい理由は、それぞれのプロトコルに準拠した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 
} 

私は手動のような何かをすることなく、FoodProductFoodEntityをマップすると、一般的な関数やメソッドを持ってできるようにしたいと思います:

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

どうすればいいですか?

+0

あなたの質問はとても混乱しています。編集してください。 –

+0

これは開始に役立ちます:http://stackoverflow.com/a/24069875/3141234 – Alexander

答えて

0

私はあなたがこのようなものを探していると思います。

これを行う一般的な方法はありません。あなたは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 
     } 
    } 
関連する問題