我有一个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吗?
答案 0 :(得分:0)
attemptRecoveryFromError:optionIndex:
是非正式协议NSErrorRecoveryAttempting
的一种方法,NSObject
未实现,请参见Formal and Informal Protocols
非正式协议是NSObject上的一个类别,它隐式地使几乎所有对象都采用该协议。 (类别是一种语言功能,使您可以将方法添加到类中而不对其进行子类化。)在非正式协议中实现方法是可选的。在调用方法之前,调用对象将检查目标对象是否实现了该方法。在Objective-C 2.0中引入可选协议方法之前,非正式协议对于Foundation和AppKit类实现委派的方式至关重要。
更多信息:Error Recovery。