我有一个Objective-C方法(在旧框架的名为“ BaseViewModel”的类中声明):
-(void) updateFromManagedObject:(__kindof NSManagedObject *)entity;
我想在多个Swift类中使用它。每个Swift类将使用NSManagedObject的特定子类,并继承自“ BaseViewModel”。当我尝试像这样重写此func时:
override func updateFromManagedObject(entity: Person?) {
<#code#>
}
OR
override func updateFromManagedObject(entity: Animal?) {
<#code#>
}
编译器返回:
方法不会覆盖其超类中的任何方法
仅适用于:
override func updateFromManagedObject(entity: NSManagedObject?) {
<#code#>
}
如何使用特定的NSManagedObject继承类型? (也许有一个Generic-Type类?我尝试过,但是也失败了:/)
overriding的要点是,当接收方是子类的实例时,将调用子类方法而不是超类方法。因此,子类方法的参数必须处理至少超类方法可以处理的所有参数。因此,子类方法的参数类型必须与其覆盖的超类方法的参数类型相同或更通用。
您不能基于参数类型重载Objective-C函数,因为Objective-C不支持这种重载。这就是为什么只有NSManagedObject
替代起作用的原因。
如果您想要基于实体类型的不同行为,一种替代方法是声明一个仅Swift的方法:
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位代码和所有...)