swift - 传递给函数的 CoreData 类型

标签 swift core-data methods

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

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
}

最佳答案

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

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

struct Car: Vehicle  {
    var distanceTraveled: Float
}

struct Boat: Vehicle {
    var distanceTraveled: Float
}

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

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

但是,我认为这比上面描述的更复杂,因为 CarBoatPlane 对象由 Core Data 管理并且是 NSManagedObject 的子类。

虽然有一些方法可以解决这个问题,例如

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

例如

Vehcile entity screenshot

Car entity screenshot

Plane entity screenshot

然后您可以像这样将 Vehicle 托管对象传递到您的函数中:

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

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

关于swift - 传递给函数的 CoreData 类型,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55128029/

相关文章:

iphone - 对具有许多对象的核心数据进行单元测试

java - 为什么 Eclipse 删除对该函数的引用?

java - 用静态方法反转数组 VS static void?

c++ - 如何正确访问好友功能?

java - 如何用 do...catch 捕获 NSRangeException?

iOS:UICollectionViewCell 根据屏幕大小自动调整大小

multithreading - Swift - 我如何等待 dispatch_async 完成?

iphone - 未设置反向关系(在 KVO 处理程序中)

swift - 重新加载 UIWebView 的按钮

swift - SpriteKit 坐标搞砸了