Swift函数重写Objective-C方法

时间:2016-01-19 16:50:54

标签: objective-c swift generics compatibility downcast

我有一个Objective-C方法(在我的旧框架的名为“BaseViewModel”的类中声明):

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

我想在多个Swift类中使用它。每个Swift类都将使用NSManagedObject的特定子类,并继承自“BaseViewModel”。当我试图像这样覆盖这个函数时:

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

OR

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

编译器返回:

  

Method不会覆盖其超类

中的任何方法

仅适用于:

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

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

3 个答案:

答案 0 :(得分:2)

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

答案 1 :(得分:0)

您不能基于参数类型重载Objective-C函数,因为Objective-C不支持这种重载。这就是为什么只有NSManagedObject重写的原因。

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

func updateFromManagedObject2(animal: Animal) {
}

func updateFromManagedObject2(person: Person) {
}

答案 2 :(得分:0)

您不能覆盖该方法,因为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位代码以及所有...)