2016-09-03 13 views
2

Примечание: я понял, что большинство из этого - см. Обновление в конце. Еще какая-то путаница.не может запускать 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.

Я переместил его, и все в порядке. Но я хотел бы получить лучшее представление о том, почему я получаю эти ошибки компиляции при реализации метода протокола из расширения. Не переносится ли это через соответствие протокола? Если я попытаюсь добавить его на расширение, я получаю сообщение об ошибке, указывающее, что это дубликат, поэтому я не думаю, что это так.

+0

При добавлении функции в расширение протокола это эквивалентно добавлению функции внутри исходного определения протокола. Вот почему вы получаете ошибку, что это дубликат. Если расширение протокола относится только к определенному типу, это другая история. – user1046037

+0

Это не расширение протокола. Я, вероятно, должен просто создать новый вопрос, потому что мне ответил старый, и теперь у меня есть новый. Вкратце - расширение просто: extension AppDelegate { Так что я расширяю класс, но не протокол. – jeffro37

ответ

2

Первоначальный вопрос был о том, почему continueUserActivity не получил вызов (и какова была правильная подпись), поэтому я отвечу на это, добавив некоторую ясность в отношении того, что пошло не так.

Правильная подпись, что я поставил в верхней части моего поста:

func application(_ application: UIApplication, 
       continue userActivity: NSUserActivity, 
     restorationHandler: @escaping ([Any]?) -> Void) -> Bool 

Имейте в виду, что это подпись отличается от того, что автозаполнения обеспечивает в Xc8b6, так что я подозреваю, что кто-то может ударить этого и выгоду от этот ответ.

Моя первоначальная проблема заключается в том, что она не компилировалась, потому что я делал это изнутри расширения. Для ясности:

extension AppDelegate { 
    func application(_ application: UIApplication, 
        continue userActivity: NSUserActivity, 
        restorationHandler: @escaping ([Any]?) -> Void) -> Bool { 
    return true 
    } 
} 

Это работало в любой старой прошивке 9/Swift 2.x проекта (со старой continueUserActivity подписи). Я все еще не уверен, почему, но он не будет компилироваться в расширении в Xc8/Swift 3.

Я переместил его в область класса, и теперь он отлично работает.

+0

У меня есть проблема с любым дополнительным методом AppDelegate. Они больше не строятся в расширениях. Это очень раздражает и делает AppDelegate супер грязным. Я думаю, может быть, что func имеет такую ​​область, как fileprivate? поэтому расширения не могут их видеть –

+0

@ jeffro37 Ваша подпись дает мне ошибки. Использование Swift 4. – Jonny

0

Итак, это похоже на то, что начиная с Swift 3, методы протокола доступны только в области, где протокол присоединен к классу.

это означает, что весь метод AppDelegate которые находятся внутри протокола UIApplicationDelegate доступен только в классе AppDelegate или в расширении AppDelegate, которое соответствует UIApplicationDelegate

Если вы пытаетесь получить доступ к методе UIApplicationDelegate за пределами этого класса/расширения, которое соответствует UIApplicationDelegate, вы не сможете скомпилировать.