假设我有三个不同的托管对象。每种类型的对象都具有相同的属性。我想编写一个方法来接受这三个对象中的任何一个并为它们的属性赋值。
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
}
但是,我认为这比上面描述的更复杂,因为 Car
、Boat
和 Plane
对象由 Core Data 管理并且是 NSManagedObject
的子类。
虽然有一些方法可以解决这个问题,例如
- NSManagedObject Can't conform to protocol in Swift
- http://lesstroud.com/dynamic-dispatch-with-nsmanaged-in-swift/
我建议在 Core Data 中创建一个包含共享属性的 Vehicle
父实体,然后使 Vehicle
成为其他实体汽车、飞机等的父实体。
例如
然后您可以像这样将 Vehicle
托管对象传递到您的函数中:
func getDistanceTravelled(vehicle: Vehicle) -> Float {
return vehicle.distanceTraveled
}
这违背了上面提到的复合重用原则,但我认为由于核心数据的性质,这可能是继承获胜的场景之一。
关于swift - 传递给函数的 CoreData 类型,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55128029/