2016-07-13 4 views
1

Ich möchte zwischen zwei beliebigen Objekten zuordnen, die dem gleichen Protokoll entsprechen. Es wäre praktisch so über eine Funktion mit der Signatur zu tun:Mapping in Swift zwischen protokollkonformen Typen

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

Noch besser ist aber (für unveränderliche Typen) wäre es in Form zu haben:

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

wo irgendwie konnte es initialisieren ein U Objekt aus den Werten in T.

Ich möchte dies über Swift Reflection anstatt mit der Objective-C Laufzeit tun, aber ich würde mich damit zufrieden geben, wenn es der einzige Weg war. Wenn es irgendwie ohne Reflexion möglich wäre, wäre das erstaunlich, aber ich sehe nicht wie.

Der Grund, warum ich das tun möchte, ist, weil ich veränderbare Realm-Klassen habe, die ihrem jeweiligen Protokoll entsprechen, und ich möchte sie den unveränderlichen Strukturtypen zuordnen.

Ein Beispiel wäre:

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

ich mit denen eine generische Funktion oder Methode zu haben, in der Lage sein möchte ein FoodEntity auf ein abzubilden FoodProduct ohne manuell wie etwas zu tun zu haben:

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

Wie kann dies getan werden, wenn es überhaupt möglich ist?

+0

Ihre Frage ist so verwirrend. Bitte bearbeiten. –

+0

Dies kann helfen, zu beginnen: http://stackoverflow.com/a/24069875/3141234 – Alexander

Antwort

0

Ich denke, dass Sie nach etwas ähnlichem suchen.

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 
    } 

Die Sache ist, dass es nicht eine generische Art und Weise sein kann, dies zu tun. Weil Sie irgendwie die Werte name, weight & price zuordnen müssen. Das ist der nächste, den du bekommen kannst, denke ich.

Oder Sie können etwas wie das tun.

Durch die Änderung Ihrer FoodEntity ein wenig.

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 
     } 
    } 
Verwandte Themen