【问题标题】:application(_:didFinishLaunchingWithOptions:)' nearly matches optional requirementapplication(_:didFinishLaunchingWithOptions:)' 几乎符合可选要求
【发布时间】:2016-12-22 16:24:12
【问题描述】:

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

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

在我的应用代理中。

有 2 个建议的修复方法可以消除警告:

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

执行任一操作都会使警告静音。但是为什么需要这样做呢?

【问题讨论】:

    标签: ios swift swift3 xcode8-beta6


    【解决方案1】:

    iOS 12 SDK 更新

    在 iOS 12 SDK(Xcode 10 附带)中,UIApplicationLaunchOptionsKey has now been renamed 为嵌套类型 UIApplication.LaunchOptionsKey,因此您需要:

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

    iOS 10 和 11 SDK(Xcode 8 和 9)

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

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

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

    请注意,Xcode 建议的修复都不会真正解决问题,它们只会在 Objective-C 中隐藏您对 application(_:didFinishLaunchingWithOptions:) 的实现——这意味着它永远不会真正被调用。

    【讨论】:

    • 是的,因为新实现没有获取选项参数,也没有从最新的 SDK 返回布尔值
    • 这里使用UIApplicationLaunchOptionsKey 建议的修复也不会抑制我在 Xcode 8 beta 6 中的项目中的警告,所以目前我必须忍受这个警告。
    • @CodePlumber 嗯,很有趣,它在 Xcode 8 beta 6 中对我来说很好用——你确定你的 launchOptions 参数是 [UIApplicationLaunchOptionsKey: Any]? 吗? (您可能忘记将AnyObject 更改为Any)。还要检查您是否缺少 application 参数的省略的外部参数标签(如果有疑问,您可以从答案中复制并粘贴签名)。如果仍然无法正常工作,您可能需要尝试清理构建文件夹。
    • 你是对的,哈米什!应该是Any 而不是AnyObject
    • 我遵循了 Xcode 建议的修复,然后无法弄清楚为什么 didFinishLaunching 中的代码没有运行。谢谢你!
    【解决方案2】:

    传递给函数的第一个参数不再具有外部名称。这实际上只是一个小细节,因为您不直接调用此方法,这是使编译器满意的快速修复。您可以手动将第一个参数名称编辑为 _,或者让 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 中获取示例链接

    【讨论】:

    • 我刚刚意识到,当我发布问题时,下划线没有出现,所以我编辑了它。方法签名始终具有 _。此警告仅出现在 Xcode 8 beta 6 上。在以前的 Xcode 8 测试版中不存在
    • 是的,这些警告有时比帮助更令人困惑
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-06-27
    • 1970-01-01
    • 2017-01-22
    • 1970-01-01
    • 1970-01-01
    • 2019-06-02
    相关资源
    最近更新 更多