在NSDocument的Swift子类的父类中找不到`attemptRecovery(fromError:optionIndex:)`

时间:2018-10-13 18:36:00

标签: objective-c swift nsobject nsdocument

我有一个objC NSDocument子类,它本身是Swift版本的子类。 ObjC版本调用BOOL result=[self attemptRecoveryFromError:error optionIndex:recoveryOptionIndex];,由Swift子类实现。

从Swift子类中,对于某些错误,将对super进行如下调用:

    guard let (error as NSError).domain == "someDomain" else {
        return super.attemptRecovery(fromError: error, optionIndex: recoveryOptionIndex)
    }

该方法不是由ObjC子类实现的,而是应由NSObject实现的,但是在运行时会出现以下错误:

-[App.AppDocument attemptRecoveryFromError:optionIndex:]: unrecognized selector sent to instance 0x60000350d340

为什么找不到方法?可能与错误类型有关,不一定是NSError吗?

1 个答案:

答案 0 :(得分:0)

attemptRecoveryFromError:optionIndex:是非正式协议NSErrorRecoveryAttempting的一种方法,NSObject未实现,请参见Formal and Informal Protocols

  

非正式协议是NSObject上的一个类别,它隐式地使几乎所有对象都采用该协议。 (类别是一种语言功能,使您可以将方法添加到类中而不对其进行子类化。)在非正式协议中实现方法是可选的。在调用方法之前,调用对象将检查目标对象是否实现了该方法。在Objective-C 2.0中引入可选协议方法之前,非正式协议对于Foundation和AppKit类实现委派的方式至关重要。

更多信息:Error Recovery