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)
?以及为什么在某些情况下使用带有(!)而不是通常的运算符(?)的向下转换关键字as
? as!
是指强制展开向下转换还是隐式展开可选向下转换?
附言不要告诉我阅读 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 语法歧义的主要内容,如果未能解决你的问题,请参考以下文章
在共享的 Swift App 框架中使用 Core Data
如何通过删除和重新安装 App 将数据持久化在 Core Data 中