【发布时间】:2015-11-04 20:43:19
【问题描述】:
我读到这行代码从 AppDelegate 获取托管对象上下文。
let managedObjectContext = (UIApplication.sharedApplication().delegate as AppDelegate).managedObjectContext
我阅读了每个单词的 Apple 文档,试图重构上述正确的整体输出意义。 谁能详细解释一下这行语法的含义?
【问题讨论】:
我读到这行代码从 AppDelegate 获取托管对象上下文。
let managedObjectContext = (UIApplication.sharedApplication().delegate as AppDelegate).managedObjectContext
我阅读了每个单词的 Apple 文档,试图重构上述正确的整体输出意义。 谁能详细解释一下这行语法的含义?
【问题讨论】:
首先您访问UIApplication 类。
这是一个单例。它只有一个实例是由 cocoa touch 框架在应用程序启动时创建的。
然后通过调用类方法sharedApplication 访问它的唯一实例。 "shared(classname)" 是一个通用名称,用于重复单例实例的方法。另一个常用名称是“sharedInstance”。
然后你访问它的delegate。这遵循了您在使用可可触摸的 iOS 应用程序开发中经常看到的常见委托模式。但这是您拥有的一个非常特殊的代表。它是AppDelegate 类。
当您让 Xcode 使用核心数据创建一个新的应用程序项目时,它会为您的 AppDelegate 类创建一些标准方法以方便您使用。
其中一个是managedObjectContext 的(计算的)getter。
然而,UIApplication 只知道它的委托是作为实现UIApplicationDelegate 协议的任何对象。 UIApplication 不知道核心数据的其他方法。
这就是为什么您必须将.sharedApplication() 的输出转换为名为@987654331@ 的实现。 as 是 Swift 中的强制转换运算符。
投射后,您实际上可以访问 getter managedObjectContext。
就是这样。
【讨论】:
id <UIApplicationDelegate> delegate; 这就是您从UIApplication.sharedApplication() 收到的内容。因此,您需要将返回值转换为 UIApplicationDelegate 的实现类,显然是 AppDelegate。