application(_:didFinishLaunchingWithOptions:)'почти соответствует необязательному требованию
После установки Xcode 8 beta 6 я получаю предупреждение:
Метод экземпляра 'application(_:didFinishLaunchingWithOptions:)' почти соответствует необязательному требованию 'application(_:didFinishLaunchingWithOptions:)' протокола 'UIApplicationDelegate'
в моем приложении делегат.
Есть 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 и образец ссылки здесь