Тип CoreData, переданный в функцию - PullRequest
2 голосов
/ 12 марта 2019

Скажем, у меня есть три разных управляемых объекта. Каждый тип объекта имеет идентичные свойства. Я хотел бы написать метод, который будет принимать любой из трех объектов и присваивать значения их свойствам.

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
}

Ответы [ 2 ]

2 голосов
/ 13 марта 2019

Обычно, следуя принципу составного повторного использования (составление по наследованию), я бы предложил использовать протокол для такой проблемы, как, например,

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.

Хотя есть способы справиться с этим, например,

Вместо этого я бы предложил создать родительскую сущность Vehicle в Базовых данных, которая содержит общие свойства, а затем сделать Vehicle родительской сущностью вашего автомобиля, самолета и т. Д.

* * Например, тысяча двадцать восемь

Скриншот объекта Vehcile

Скриншот автомобильной сущности

Скриншот сущности самолета

Затем вы можете передать управляемый объект Vehicle в вашу функцию следующим образом:

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

Это идет вразрез с принципом составного повторного использования, упомянутым выше, но я думаю, что из-за природы базовых данных это может быть один из тех сценариев, где выигрывает наследование.

0 голосов
/ 13 марта 2019

A swifty - это расширение протокола, ограниченное NSManagedObject

protocol TravelDistance {
    var distanceTraveled: Float { get }
}

extension TravelDistance where Self : NSManagedObject {
    func getDistanceTravelled(vehicle: TravelDistance) -> Float {
        return vehicle.distanceTraveled
    }
}

Все подклассы NSManagedObject, соответствующие TravelDistance, могут использовать этот метод.

...