`attemptRecovery(fromError:optionIndex:)` 在 NSDocument 的 Swift 子类的超类中找不到
Posted
技术标签:
【中文标题】`attemptRecovery(fromError:optionIndex:)` 在 NSDocument 的 Swift 子类的超类中找不到【英文标题】:`attemptRecovery(fromError:optionIndex:)` not found on super of Swift subclass of NSDocument 【发布时间】:2018-10-13 18:35:59 【问题描述】:我有一个 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
为什么找不到方法?是否可能与 Error 的类型不一定是 NSError 有关?
【问题讨论】:
attemptRecoveryFromError:optionIndex:
是一种非正式协议NSErrorRecoveryAttempting的方法,NSObject
没有实现。
This page 另有建议。我理解错了吗?
是的“已实施”表示可以实施。 NSObject
不知道如何恢复。见Formal and Informal Protocols 和Error Recovery。
@Willeke 我现在看到了。如果您将其作为答案,我可以将其标记为这样。谢谢。
【参考方案1】:
attemptRecoveryFromError:optionIndex:
是非正式协议NSErrorRecoveryAttempting
的方法,NSObject
未实现参见Formal and Informal Protocols
非正式协议是 NSObject 上的一个类别,它隐含地使几乎所有对象都采用该协议。 (类别是一种语言特性,它使您能够在不继承类的情况下向类添加方法。)非正式协议中方法的实现是可选的。在调用方法之前,调用对象会检查目标对象是否实现了它。在 Objective-C 2.0 中引入可选协议方法之前,非正式协议对于 Foundation 和 AppKit 类实现委托的方式至关重要。
更多信息:Error Recovery。
【讨论】:
以上是关于`attemptRecovery(fromError:optionIndex:)` 在 NSDocument 的 Swift 子类的超类中找不到的主要内容,如果未能解决你的问题,请参考以下文章