`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 子类的超类中找不到的主要内容,如果未能解决你的问题,请参考以下文章