2016-07-13 1 views
1

같은 프로토콜을 따르는 두 객체간에 매핑하고 싶습니다. 서명 기능을 통해 그렇게 편리 할 것입니다 : 더 나은프로토콜 준수 유형 간 신속한 매핑

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

하지만 (불변 유형) 형태로 그것을 가지고하는 것입니다 :

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

가 초기화 할 수 어떻게 든 a UT의 값에서 오브젝트.

Objective-C 런타임을 사용하는 대신 Swift Reflection을 통해이 작업을 수행하고 싶습니다. 그러나 이것이 유일한 방법 인 경우이를 해결할 것입니다. 어쨌든 그것은 반사없이 이루어질 수 있다면 놀랄 것입니다. 그러나 나는 어떻게 보이지 않습니다.

내가 원하는 이유는 각각의 프로토콜을 준수하는 변경할 수있는 영역 클래스가 있고이를 immutable 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 
} 
나는 일반적인 기능 또는 수동으로 같은 것을 할 필요없이 FoodProductFoodEntity를 매핑하는 데 사용할 방법을 가질 수 있도록하고 싶습니다

:

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