在 Swift 中映射符合协议的类型



我想在符合相同协议的任何两个对象之间进行映射。通过带有签名的函数执行此操作会很方便:

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

更好的是(对于不可变类型)以以下形式拥有它:

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

它可以以某种方式从 T 中的值初始化U对象。

我想通过 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
}

我希望能够有一个通用函数或方法,用于将FoodEntity映射到FoodProduct,而无需手动执行以下操作:

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

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

我认为

您正在寻找这样的东西。

 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
    }

问题是不可能有一种通用的方法可以做到这一点。因为你必须以某种方式分配nameweightprice的值。我认为这是你能得到的最接近的。

或者你可以做这样的事情。

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

相关内容

  • 没有找到相关文章

最新更新