application(_:didFinishLaunchingWithOptions :)'几乎匹配可选要求

dor*_*mon 27 ios swift swift3 xcode8-beta6

安装Xcode 8 beta 6后,我收到一条警告说:

实例方法'application(_:didFinishLaunchingWithOptions :)'几乎匹配协议'UIApplicationDelegate'的可选要求'application(_:didFinishLaunchingWithOptions :)'

在我的App代表中.

有2个建议的修正来使警告静音:

  1. 将该方法标记为私有
  2. 将@nonobjc添加到方法中

做任何一个都会使警告静音.但为什么需要这样做呢?

Ham*_*ish 52

iOS 12 SDK更新

在iOS 12 SDK(随Xcode 10提供)中,UIApplicationLaunchOptionsKey 现在已经重命名为嵌套类型UIApplication.LaunchOptionsKey,因此您需要:

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

iOS 10和11 SDK(Xcode 8和9)

这个警告是由于委托方法的didFinishLaunchingWithOptions:参数application(_:didFinishLaunchingWithOptions:)现在桥接到Swift作为a [UIApplicationLaunchOptionsKey: Any]?而不是[NSObject : AnyObject]?.

因此,您需要更新实施以反映此更改:

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

请注意,Xcode的建议修复都不能解决问题,它们只会隐藏application(_:didFinishLaunchingWithOptions:)Objective-C的实现 - 这意味着它实际上永远不会被调用.

  • @CodePlumber很有意思,它在Xcode 8 beta 6中对我来说很好用 - 你确定你的`launchOptions`参数是`[UIApplicationLaunchOptionsKey:Any]吗?`?(你可能忘记将`AnyObject`改为'Any`).还要检查你是否错过了`application`参数的省略外部参数标签(如果有疑问,你可以复制并粘贴答案中的签名).如果它仍然无法正常工作,您可能需要尝试清理构建文件夹. (2认同)