App Delegate 中 Core Data 堆栈变量中的 Swift 语法歧义

Posted

技术标签:

【中文标题】App Delegate 中 Core Data 堆栈变量中的 Swift 语法歧义【英文标题】:Swift syntax ambiguity in Core Data stack variables in App Delegate 【发布时间】:2015-09-08 12:12:49 【问题描述】:

对于来自 AppDelegate 的这段代码:

lazy var managedObjectModel: NSManagedObjectModel = 
    // The managed object model for the application. This property is not optional. It is a fatal error for the application not to be able to find and load its model.
    let modelURL = NSBundle.mainBundle().URLForResource("Test102", withExtension: "momd")!
    return NSManagedObjectModel(contentsOfURL: modelURL)!
()

1) 等号后面的语法是什么:var x : Type? = statements() 我知道闭包的语法是 (args->returnType in statements)statements()statements 如果闭包是函数中的最后一个参数

2) 有时,我看到可选项的用法不明确,为什么要对返回的对象使用强制展开运算符 ( ! )?为什么不直接使用 return NSManagedObjectModel(contentsOfURL: modelURL) ?以及为什么在某些情况下使用带有(!)而不是通常的运算符(?)的向下转换关键字asas! 是指强制展开向下转换还是隐式展开可选向下转换

附言不要告诉我阅读 Swift 中的 optionals 章节或阅读 swift 书籍,因为我已经这样做了。

【问题讨论】:

【参考方案1】:

1) 语法实际上是一个函数/闭包,称为Lazy Stored Property。它像单例一样工作,并在第一次访问该属性时被初始化(一次)。

来自文档:

惰性存储属性是在第一次使用之前不计算初始值的属性。您可以通过在声明之前编写惰性修饰符来指示惰性存储属性。

2) 如果您知道表达式的结果是 never nil 并且结果类型是 always 指定的类型,请使用强制展开的向下转换运算符 @987654323 @ 否则使用带有 as? 运算符的可选绑定来检查 nil 和类型

【讨论】:

我不是在问惰性修饰符,我是在问语法 statements 后跟 () 这是一个普通的函数语法 函数语法是 func x (args) -> returnType 或 func x ( ) 但不是 func x ( )【参考方案2】:

读完苹果的The Swift Programming Language一书,Initialization 章节的最后一节回答了我的问题:“Setting a default property value with aclosure or function”,正是阅读这句话:

请注意,闭包的结尾大括号后面是一对空括号。这告诉 Swift 立即执行闭包。如果省略这些括号,则试图将闭包本身分配给属性,而不是闭包的返回值

【讨论】:

以上是关于App Delegate 中 Core Data 堆栈变量中的 Swift 语法歧义的主要内容,如果未能解决你的问题,请参考以下文章

Core Data 中保存/获取数据的不一致

使用 Delegate 监听变化 - 核心数据

在共享的 Swift App 框架中使用 Core Data

如何通过删除和重新安装 App 将数据持久化在 Core Data 中

如何在 Core Data/Cloud Kit App 中找到并删除正在创建 CDMR 同步请求的内容?

无法在测试中将 App Delegate 强制转换为 App Delegate