swift 3“几乎匹配可选要求”中的所有 6 个应用程序委托功能 - 这是啥?怎么修?

Posted

技术标签:

【中文标题】swift 3“几乎匹配可选要求”中的所有 6 个应用程序委托功能 - 这是啥?怎么修?【英文标题】:All 6 app delegate functions in swift 3 "nearly match optional requirement" - what is this? How to fix?swift 3“几乎匹配可选要求”中的所有 6 个应用程序委托功能 - 这是什么?怎么修? 【发布时间】:2016-07-16 00:35:45 【问题描述】:

昨晚下载了 xcode 8.2 beta,转换了我的大部分代码,但现在我遇到了关于应用程序委托的六个功能的黄色警告符号:

var window: UIWindow?


func application(application: UIApplication, didFinishLaunchingWithOptions launchOptions: [NSObject: AnyObject]?) -> Bool 
    // Override point for customization after application launch.
    return true


  func applicationWillResignActive(application: UIApplication) 
    // Sent when the application is about to move from active to inactive state. This can occur for certain types of temporary interruptions (such as an incoming phone call or SMS message) or when the user quits the application and it begins the transition to the background state.
    // Use this method to pause ongoing tasks, disable timers, and throttle down OpenGL ES frame rates. Games should use this method to pause the game.


  func applicationDidEnterBackground(application: UIApplication) 
    // Use this method to release shared resources, save user data, invalidate timers, and store enough application state information to restore your application to its current state in case it is terminated later.
    // If your application supports background execution, this method is called instead of applicationWillTerminate: when the user quits.


  func applicationWillEnterForeground(application: UIApplication) 
    // Called as part of the transition from the background to the active state; here you can undo many of the changes made on entering the background.


 func applicationDidBecomeActive(application: UIApplication) 
    // Restart any tasks that were paused (or not yet started) while the application was inactive. If the application was previously in the background, optionally refresh the user interface.


func applicationWillTerminate(application: UIApplication) 
    // Called when the application is about to terminate. Save data if appropriate. See also applicationDidEnterBackground:.


我可以使用任一方法“修复”每个功能

  Rename to application(_:didFinishLaunchingWithOptions:)' to      satisfy this requirement

  Make 'application(application:didFinishLaunchingWithOptions:)'       private to slince this warning 

Add '@nonobjc' to silence this warning

考虑到我以前从未见过这三个选项,有人介意解释一下以及解决或忽略它们的任何选项吗?

【问题讨论】:

【参考方案1】:

这都是“重命名”的一部分,Swift 3 对方法的第一个参数的外部化规则进行了更改。

所以,请执行第一个选项:输入_ 以使_ application:(而不是application: 简单明了)作为每种情况下的第一个参数的名称。否则,application 将被外部化,Objective-C 会将这些方法视为称为 applicationWithApplication...,这不是您想要发生的。

不要做其他任何一个。你不想隐藏这些方法在 Objective-C 中(private@nonobjc);您希望 Objective-C 能够看到它们,尤其是将它们视为应用程序委托协议方法。

【讨论】:

感谢您的持续解释! 将函数保留为“_应用程序:”是否安全 我很惊讶这些在你运行迁移器时没有得到修复,但是,至少你现在已经修复了。您必须承认,考虑到它必须应对的一切,迁移器非常出色。 Xcode 8 beta 6 更改launchOptions 的参数类型:func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplicationLaunchOptionsKey : Any]? = nil) -> Bool Xcode 的自动完成添加了 = nil 部分,但你说得对,这不是必需的。【参考方案2】:

我有一个实例,我在扩展中有 UITextViewDelegate,但拼错了类,使其成为冗余一致性。

【讨论】:

【参考方案3】:

这是我修复的方法:

旧代码:

func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [NSObject: AnyObject]?) -> Bool 
    // Override point for customization after application launch.
    return true

新代码:

func applicationDidFinishLaunching(_ application: UIApplication) 
    // Override point for customization after application launch.

【讨论】:

这是错误的。 applicationDidFinishLaunchingios 2 以来一直在 iOS 中没有启动选项,不鼓励您在苹果文档中使用它。

以上是关于swift 3“几乎匹配可选要求”中的所有 6 个应用程序委托功能 - 这是啥?怎么修?的主要内容,如果未能解决你的问题,请参考以下文章

实例方法'mapView(_:didFailToLocateUserWithError :)'几乎匹配可选要求

代表不再被称为 swift

使用 swift 3 访问 JSON 中的值

如何使用神奇的 Records Library Swift 获取属性中的所有值

Swift 3.0 地图似乎又迭代了 1 个循环 [重复]

Swift中的Loop for Loop总和