application(_:didFinishLaunchingWithOptions:)'почти соответствует необязательному требованию

После установки Xcode 8 beta 6 я получаю предупреждение:

Метод экземпляра 'application(_:didFinishLaunchingWithOptions:)' почти соответствует необязательному требованию 'application(_:didFinishLaunchingWithOptions:)' протокола 'UIApplicationDelegate'

в моем приложении делегат.

Есть 2 предложенных исправления, чтобы заглушить предупреждение:

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

В любом случае предупреждение замалчивается. Но почему это нужно сделать?

2 ответа

Решение

iOS 12 SDK Обновление

В iOS 12 SDK (который поставляется с Xcode 10), UIApplicationLaunchOptionsKey теперь был переименован во вложенный тип UIApplication.LaunchOptionsKey так что вы захотите:

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

iOS 10 и 11 SDK (Xcode 8 и 9)

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

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

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

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

первый параметр, переданный в функцию, больше не имеет внешнего имени. Это на самом деле незначительная деталь, так как вы не вызываете этот метод напрямую, и это быстрое решение, которое порадует компилятора. Вы можете либо вручную отредактировать это имя первого параметра на _, либо просто позволить 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 и образец ссылки здесь

Другие вопросы по тегам