【问题标题】:(UIApplication.sharedApplication().delegate as AppDelegate).managedObjectContext(UIApplication.sharedApplication().delegate as AppDelegate).managedObjectContext
【发布时间】:2015-11-04 20:43:19
【问题描述】:

我读到这行代码从 AppDelegate 获取托管对象上下文。

let managedObjectContext = (UIApplication.sharedApplication().delegate as AppDelegate).managedObjectContext

我阅读了每个单词的 Apple 文档,试图重构上述正确的整体输出意义。 谁能详细解释一下这行语法的含义?

【问题讨论】:

    标签: ios swift


    【解决方案1】:

    首先您访问UIApplication 类。

    这是一个单例。它只有一个实例是由 cocoa touch 框架在应用程序启动时创建的。

    然后通过调用类方法sharedApplication 访问它的唯一实例。 "shared(classname)" 是一个通用名称,用于重复单例实例的方法。另一个常用名称是“sharedInstance”。

    然后你访问它的delegate。这遵循了您在使用可可触摸的 iOS 应用程序开发中经常看到的常见委托模式。但这是您拥有的一个非常特殊的代表。它是AppDelegate 类。 当您让 Xcode 使用核心数据创建一个新的应用程序项目时,它会为您的 AppDelegate 类创建一些标准方法以方便您使用。

    其中一个是managedObjectContext 的(计算的)getter。

    然而,UIApplication 只知道它的委托是作为实现UIApplicationDelegate 协议的任何对象。 UIApplication 不知道核心数据的其他方法。

    这就是为什么您必须将.sharedApplication() 的输出转换为名为@9​​87654331@ 的实现。 as 是 Swift 中的强制转换运算符。

    投射后,您实际上可以访问 getter managedObjectContext

    就是这样。

    【讨论】:

    • 我也在寻找这个问题的答案。这真的是一个很好的答案。我几乎很清楚。但是我在这里感到困惑“但是,UIApplication 仅将其委托知道为实现 UIApplicationDelegate 协议的任何对象。UIApplication 不知道核心数据的其他方法”。您能否更详细地解释这一点。谢谢。
    • @bir,委托被声明为类似于id <UIApplicationDelegate> delegate; 这就是您从UIApplication.sharedApplication() 收到的内容。因此,您需要将返回值转换为 UIApplicationDelegate 的实现类,显然是 AppDelegate
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-12-26
    • 1970-01-01
    相关资源
    最近更新 更多