首页 > 解决方案 > `attemptRecovery(fromError:optionIndex:)` 在 NSDocument 的 Swift 子类的超类中找不到

问题描述

我有一个 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 有关?

标签: objective-cswiftnsobjectnsdocument

解决方案


attemptRecoveryFromError:optionIndex:是一种非正式协议的方法,NSErrorRecoveryAttempting不被实现NSObject正式和非正式协议

非正式协议是 NSObject 上的一个类别,它隐含地使几乎所有对象都采用该协议。(类别是一种语言特性,它使您能够在不继承类的情况下向类添加方法。)非正式协议中方法的实现是可选的。在调用方法之前,调用对象会检查目标对象是否实现了它。在 Objective-C 2.0 中引入可选协议方法之前,非正式协议对于 Foundation 和 AppKit 类实现委托的方式至关重要。

更多信息:错误恢复


推荐阅读