首页 > 解决方案 > 传递给函数的 CoreData 类型

问题描述

假设我有三个不同的托管对象。每种类型的对象都具有相同的属性。我想编写一个方法来接受这三个对象中的任何一个并将值分配给它们的属性。

let car = Car(context: context)
let boat = Boat(context: context)
let plane = Plane(context: context)

getDistanceTraveled(vehicle: car)

func getDistanceTraveled(vehicle: NSManagedObject) {
    let newVehicle = vehicle as? Car //Instead of Car I want to cast this as the type being passed in.
    newVehicle.distanceTraveled = 43
}

标签: swiftcore-datamethods

解决方案


通常,遵循复合重用原则(组合优于继承),我建议使用协议来解决这样的问题,例如

protocol Vehicle {
    var distanceTraveled: Float { get set }
}

struct Car: Vehicle  {
    var distanceTraveled: Float
}

struct Boat: Vehicle {
    var distanceTraveled: Float
}

然后将 a 传递给Vehicle您的函数:

func getDistanceTravelled(vehicle: Vehicle) -> Float {
    return vehicle.distanceTraveled
}

但是,我认为这比上面描述的更复杂Car,对象由 Core Data 管理,并且Boat是.PlaneNSManagedObject

虽然有办法解决这个问题,例如

相反,我建议Vehicle在 Core Data 中创建一个包含共享属性Vehicle的父实体,然后创建其他实体汽车、飞机等的父实体。

例如

车辆实体截图

汽车实体截图

平面实体截图

然后,您可以将Vehicle托管对象传递给您的函数,如下所示:

func getDistanceTravelled(vehicle: Vehicle) -> Float {
    return vehicle.distanceTraveled
}

这违背了上面提到的复合重用原则,但我认为由于核心数据的性质,这可能是继承获胜的场景之一。


推荐阅读