WatchKit 中 UIApplication.sharedApplication().delegate 的等价物是什么?

What is the equivalent of UIApplication.sharedApplication().delegate in WatchKit?

在 iOS 应用程序中,您可以通过以下方式获取对共享应用程序委托的引用:

Swift:
let delegate = UIApplication.sharedApplication().delegate as! AppDelegate

Objective-C:
AppDelegate *delegate = [[UIApplication sharedApplication] delegate];

在 WatchKit2 App Extension 中有一个类似的 App Delegate,我想在视图控制器中获取对它的引用以访问应用程序中的共享资源,例如核心数据堆栈的 ManagedObjectModel 和 PersistentStoreCoordinator,即我已经在 App Delegate 中初始化了。

但是,UIApplication.sharedApplication().delegate as! AppDelegate报错,

Use of unresolved identifier 'UIApplication'

如何在 WatchKit2 应用扩展中访问应用委托?

WatchOS 2 中的 WKExtension class 会自动为每个扩展提供一个单独的扩展对象,以管理在您应用的所有界面控制器之间共享的行为。 Apple Documentation 指出您 "use the extension object to perform app-level tasks such as opening URLs and getting the root interface controller of your app."

就像在 iOS 中一样,在您的 WatchKit App Extension 中,您提供了自己的委托对象,即您尝试引用的委托对象。这会自动分配给 WKExtension 对象的委托 属性,并且可以使用与用于访问 iOS:

中的 UIApplication 委托的类似方法来访问

Swift:
let delegate = WKExtension.sharedExtension().delegate as! ExtensionDelegate

Objective-C:
WKExtensionDelegate *delegate = [[WKExtension sharedExtension] delegate];

Apple documentation of the WKExtension Class 提供了有关功能的更多信息。


更深入:
WatchKit App Extensions 并非在所有情况下都必须提供 WKExtensionDelegate。正如 WKExtensionDelegate documentation from Apple 注释,"You provide the delegate object and use it to manage lifecycle events in your extension. Providing a delegate object is required if your extension supports actionable notifications or Handoff behaviours."

您将知道您的 WatchKit App Extension 是否有委托对象,如果有,则在您的 App Extension 生命周期中,您尝试访问不存在的 App Delegate 将毫无意义。因此,虽然 WKExtension.sharedExtension().delegate 是可选的(WatchKit App Extensions 可能存在于未设置委托的地方),但使用 as! 强制将 return 强制转换为非可选是安全的上面的例子,假设开发者知道他们在他们的 App Extension 中设置了一个 WKExtensionDelegate。

extension ExtensionDelegate {
    static var shared: ExtensionDelegate {
        guard let delegate = WKExtension.shared().delegate as? ExtensionDelegate else {
            fatalError("ExtensionDelegate")
        }
        return delegate
    }
}