`попытка открытия (fromError: optionIndex:)` не найдена на суперклассе подкласса Swift NSDocument - PullRequest
0 голосов
/ 13 октября 2018

У меня есть подкласс 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)
    }

Thisметод не реализован в подклассе ObjC, но должен быть реализован NSObject, но во время выполнения я получаю следующую ошибку:

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

Почему он не находит метод?Возможно, это как-то связано с типом Error, который не обязательно является NSError?

1 Ответ

0 голосов
/ 15 октября 2018

attemptRecoveryFromError:optionIndex: - это метод неформального протокола NSErrorRecoveryAttempting, который не реализован NSObject См. Формальные и неформальные протоколы

Неформальный протокол относится к категории поNSObject, который неявно делает практически все объекты приемниками протокола.(Категория - это языковая функция, которая позволяет добавлять методы в класс без его подкласса.) Реализация методов в неформальном протоколе является необязательной.Перед вызовом метода вызывающий объект проверяет, реализует ли его целевой объект.До тех пор, пока в Objective-C 2.0 не были введены дополнительные методы протокола, неофициальные протоколы были важны для способа, которым классы Foundation и AppKit реализовали делегирование.

Дополнительная информация: Восстановление после ошибок .

...