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