swift - 传递给函数的 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
}
解决方案
通常,遵循复合重用原则(组合优于继承),我建议使用协议来解决这样的问题,例如
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
是.Plane
NSManagedObject
虽然有办法解决这个问题,例如
相反,我建议Vehicle
在 Core Data 中创建一个包含共享属性Vehicle
的父实体,然后创建其他实体汽车、飞机等的父实体。
例如
然后,您可以将Vehicle
托管对象传递给您的函数,如下所示:
func getDistanceTravelled(vehicle: Vehicle) -> Float {
return vehicle.distanceTraveled
}
这违背了上面提到的复合重用原则,但我认为由于核心数据的性质,这可能是继承获胜的场景之一。
推荐阅读
- firebase - 如何通过应用引擎监控firestore并同时执行多个游戏?
- command-line-interface - 如何使用 go lang 模板选项过滤 openshift pod?
- authentication - 为什么 Google Cloud Translate 无法提供持久性 503 服务?
- azure-data-factory-2 - Azure 数据工厂从 URL 保存 CSV
- amazon-web-services - 从另一个 AWS 账户访问 S3 Inventory
- python - 使用 importlib 加载模块时如何允许相对导入
- r - 导入未按逻辑方式排序的数据
- javascript - 在“显示条目”中选择“全部”时的数据表,没有找到匹配的记录
- apache-spark - 当有过滤器和效率建议时,Spark 如何处理 parquet 文件
- mysql - 我很难确定哪种关系是合适的(是一对一还是一对多)