Swift 函数覆盖 Objective-C 方法

Swift function overriding Objective-C method

我有一个 Objective-C 方法(在我的旧框架的名为 "BaseViewModel" 的 class 中声明)是:

-(void) updateFromManagedObject:(__kindof NSManagedObject *)entity;

我想在多个 Swift class 中使用它。每个 Swift class 将使用 NSManagedObject 的特定子 class 并继承自 "BaseViewModel"。当我尝试像这样覆盖此功能时:

override func updateFromManagedObject(entity: Person?) {
    <#code#>
}

override func updateFromManagedObject(entity: Animal?) {
    <#code#>
}

编译器returns:

Method does not override any method from its superclass

它只适用于:

override func updateFromManagedObject(entity: NSManagedObject?) {
    <#code#>
}

如何使用特定的继承类型的 NSManagedObject ? (也许使用 class Generic-Type?我尝试但也失败了:/)

overriding的要点是当接收者是子类的实例时调用子类方法而不是超类方法。因此,子类方法的参数必须处理至少超类方法可以处理的所有参数。因此子类方法的参数类型必须与其覆盖的超类方法的参数类型相同或更通用。

您不能根据参数类型重载 Objective-C 函数,因为 Objective-C 不支持这种重载。这就是为什么只有 NSManagedObject 覆盖有效。

如果您想要基于实体类型的不同行为,另一种方法是声明一个 Swift-only 方法:

func updateFromManagedObject2(animal: Animal) {
}

func updateFromManagedObject2(person: Person) {
}

您不能覆盖该方法,因为 objective-c 和 swift 中的类型有点不同。类型必须准确排列,否则覆盖将不起作用。

上面的So the subclass method's parameters' types must be the same or more general than the parameters' types for the superclass method it overrides.You cannot overload Objective-C functions based on the argument type, as Objective-C doesn't support this kind of overloading两个说法都是正确的。

另一个说明这一点的覆盖示例:

- (UIColor*)getDataPointColor:(int)index
{
    return UIColor.whiteColor;
}
override func getDataPointColor(_ index: Int32) -> UIColor {
   return UIColor.redColor
}

请注意,override func getDataPointColor(_ index: Int) -> UIColor { 将不起作用。 (不知道为什么,64 位代码和所有...)