2016-08-16 2 views
27

После установки Xcode 8 Beta 6, я получаю предупреждение о том, Методприложение (_: didFinishLaunchingWithOptions :)»почти соответствует факультативное требование

Instance 'приложения (_: didFinishLaunchingWithOptions :) почти соответствует желанию Требование '(_: didFinishLaunchingWithOptions :)' протокола 'UIApplicationDelegate'

в моем делете делегата.

Есть 2 предложили fixits заглушить предупреждение:

  1. Отметить метод как частные
  2. Добавить @nonobjc методу

Doing либо заглушает предупреждение. Но зачем это нужно делать?

ответ

49

Это предупреждение связано с тем, что didFinishLaunchingWithOptions: параметр application(_:didFinishLaunchingWithOptions:) Метод делегата теперь соединен с Swift как [UIApplicationLaunchOptionsKey: Any]?, а не [NSObject : AnyObject]?.

Поэтому вам необходимо обновить реализацию, чтобы отразить это изменение:

func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplicationLaunchOptionsKey: Any]?) -> Bool { 
    // ... 
} 

Обратите внимание, что ни один из предложенных исправлений Xcode будет на самом деле решить эту проблему, они лишь скрывают свою реализацию в application(_:didFinishLaunchingWithOptions:) от объективно- C - означает, что он никогда не будет вызван.

+2

Спасибо! Должен был сначала проверить ссылку на API ... – doraemon

+1

Да, поскольку новая реализация не получает параметр параметров, а также не возвращает Boolean из последнего SDK – pedrouan

+1

Исправление, предлагаемое здесь с помощью 'UIApplicationLaunchOptionsKey', не подавляет предупреждение в моем проекте в Xcode 8 beta 6, так что в настоящее время мне приходится жить с этим предупреждением. – CodePlumber

3

Первый параметр, переданный в функцию, больше не имеет внешнего имени. Это действительно незначительная деталь, так как вы не вызываете этот метод напрямую, и это быстрое решение, чтобы сделать компилятор счастливым. Вы можете вручную изменить это имя первого параметра на _ или просто позволить Xcode обрабатывать это для вас.

func application(_ application: UIApplication, 
didFinishLaunchingWithOptions launchOptions: [NSObject : AnyObject]?) -> Bool 

или Новый синтаксис

func application(_ application:UIApplication, 
didFinishLaunchingWithOptions launchOptions: [UIApplicationLaunchOptionsKey : Any]? = nil) -> Bool // or remove = nil and try 

вы можете получить последнюю документацию от apple и ссылку образца в here

+1

Я просто понял, что когда я разместил вопрос, подчеркивание не появилось, поэтому я его отредактировал. Подпись метода всегда имела _. Это предупреждение появилось только на Xcode 8 beta 6. Это не было в предыдущих бета-версиях Xcode 8 – doraemon

+0

Да, эти предупреждения иногда более запутывают, чем помогают – pedrouan

Смежные вопросы