Примечание. Я понял большую часть этого — см. обновление в конце. Еще какое-то замешательство.
Я пытаюсь реализовать обработку NSUserActivity в Xc8b6 под Swift 3, и у меня возникают проблемы с подписью метода для метода протокола обработчика.
В текущем документе этот метод называется:
func application(_ application: UIApplication,
continue userActivity: NSUserActivity,
restorationHandler: @escaping ([Any]?) -> Void) -> Bool
Это лишь немного отличается от того, что я вижу в интерфейсе быстрого заголовка. Там тип возвращаемого значения в restoreHandler — Swift.Void.
Когда я пытаюсь это сделать, я получаю сообщение об ошибке:
Метод Objective-C 'application:continue:restorationHandler:', предоставленный методом 'application(_:continue:restorationHandler:)', не соответствует селектору требования ('application:continueUserActivity:restorationHandler:')
Я понимаю, что предупреждения компилятора сейчас не очень хороши, но я понимаю, что для этого найдена сигнатура метода Obj-C, но почему-то мои аргументы не совсем совпадают.
Я не уверен, куда еще пойти с этим. Он соответствует тому, что есть, но что-то не так. Случайное угадывание и проверка мне пока не помогли.
Интересно, что автозаполнение дает мне другую сигнатуру метода:
public func application(_ application: UIApplication, continue userActivity: NSUserActivity, restorationHandler: ([Any]?) -> Void) -> Bool
Самое приятное в этом то, что он компилируется. Менее приятно то, что он не срабатывает, когда я выбираю проиндексированный элемент из Spotlight и касаюсь его, чтобы запустить приложение.
Очевидно, что мой NSUserAction правильно определил приложение и запустил его. Есть ли что-то, что я мог бы упустить здесь, где он не запускал бы restoreHandler? Обратите внимание, что это преобразовано из проекта, который отлично работал под iOS 9.
Я также видел еще одну версию сигнатуры метода протокола в видеоролике WWDC «Что нового в поиске». Я попробовал это, и он скомпилировался, но не сработал.
В завершение скажу, что это подпись, которую я получил после завершения работы инструмента преобразования Swift 3. Он скомпилировался, но не сработал при запуске из Spotlight:
func application(application: UIApplication, continueUserActivity userActivity: NSUserActivity, restorationHandler: ([AnyObject]) -> Void) -> Bool
----Обновлять-----
В порядке. Таким образом, первая сигнатура метода, упомянутая выше, является правильной. Проблема в том, что я определял это в расширении AppDelegate. Это отлично работало в Swift 2.x.
Я поднял его, и все в порядке. Но я хотел бы лучше понять, почему я получаю эти ошибки компиляции при реализации метода протокола из расширения. Это больше не соответствует протоколу? Если я попытаюсь добавить его в расширение, я получу сообщение об ошибке, указывающее, что это дубликат, поэтому я не думаю, что это совсем так.