Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/objective-c/23.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Swift函数覆盖Objective-C方法_Objective C_Swift_Generics_Compatibility_Downcast - Fatal编程技术网

Swift函数覆盖Objective-C方法

Swift函数覆盖Objective-C方法,objective-c,swift,generics,compatibility,downcast,Objective C,Swift,Generics,Compatibility,Downcast,我有一个Objective-C方法(在旧框架名为“BaseViewModel”的类中声明),它是: -(void) updateFromManagedObject:(__kindof NSManagedObject *)entity; 我想在多个Swift类中使用它。每个Swift类将使用NSManagedObject的特定子类,并从“BaseViewModel”继承。当我试图像这样重写此函数时: override func updateFromManagedObject(entity: Pe

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

-(void) updateFromManagedObject:(__kindof NSManagedObject *)entity;
我想在多个Swift类中使用它。每个Swift类将使用NSManagedObject的特定子类,并从“BaseViewModel”继承。当我试图像这样重写此函数时:

override func updateFromManagedObject(entity: Person?) {
    <#code#>
}
覆盖函数更新管理对象(实体:Person?){
}

覆盖函数更新管理对象(实体:动物?){
}
编译器返回:

方法不重写其超类中的任何方法

它仅适用于:

override func updateFromManagedObject(entity: NSManagedObject?) {
    <#code#>
}
覆盖函数更新管理对象(实体:NSManagedObject?){
}

如何使用NSManagedObject的特定继承类型?(可能是类泛型类型?我尝试过,但也失败了:/)

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

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

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

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

func updateFromManagedObject2(animal: Animal) {
}

func updateFromManagedObject2(person: Person) {
}

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

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

func updateFromManagedObject2(animal: Animal) {
}

func updateFromManagedObject2(person: Person) {
}

您不能重写该方法,因为objective-c和swift中的类型有点不同。类型必须完全对齐,否则重写将不起作用

这两个语句
,因此子类方法的参数类型必须与它所覆盖的超类方法的参数类型相同或更一般。
不能基于参数类型重载Objective-C函数,因为Objective-C不支持这种重载。
以上是正确的

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

- (UIColor*)getDataPointColor:(int)index
{
    return UIColor.whiteColor;
}

请注意,
override func getDataPointColor(u-index:Int)->UIColor{
将不起作用。(不确定原因,64位代码和所有…

您无法重写该方法,因为objective-c和swift中的类型有点不同。类型必须完全对齐,否则重写将不起作用

这两个语句
,因此子类方法的参数类型必须与它所覆盖的超类方法的参数类型相同或更一般。
不能基于参数类型重载Objective-C函数,因为Objective-C不支持这种重载。
以上是正确的

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

- (UIColor*)getDataPointColor:(int)index
{
    return UIColor.whiteColor;
}

请注意,
覆盖func getDataPointColor(uindex:Int)->UIColor{
将不起作用。(不确定原因,64位代码和所有…)

您试图实现的是函数重载,但是Objective-C函数/方法不支持重载,因为Objective-C不支持重载。如果您发布一些ViewModel类的示例,也许我们会找到另一种方法。@Cristik无需发布任何其他内容,我提供的代码足以解释问题。你是对的,它是
重载
而不是
重写
,但是它使用的是Obj C。我的答案是否定的,你不能用
objc
方法:)实现这种重载,你试图实现的是函数重载,但是这在Objective-C函数/方法中是不可能的,因为Objective-C不支持重载。如果你发布一些ViewModel类的示例,也许我们会找到另一种方法。@Cristik无需发布任何其他内容,我给出的代码足以解释问题。你是对的,它是
重载
而不是
重写
,但它正在与Obj C一起工作。如果我的答案是“否”,你不能这样做使用
objc
方法加载:)好的,我理解这个答案,但它与Obj-C一起工作。我的方法子类是
-(void)updateFromanagedObject:(动物*)实体{}
,它被调用了,那么它是一个特定的Swift限制吗?事实上,我认为Obj-C方法调用只是基于执行选择器。选择器没有考虑参数类型,所以它工作了。Swift更严格,禁止这种做法。好的,我理解这个答案,谢谢,但它与Obj-C一起工作。我的方法子类是
-(void)updateFromManagedObject:(动物*)实体{}
,它被调用了,那么它是一个特定的Swift限制吗?事实上,我认为Obj-C方法调用只是基于执行选择器。选择器没有考虑参数类型,所以它起作用了。Swift更严格,禁止这种做法。