Swift立即执行闭包赋值给变量时必须返回对应类型的值吗?
问题解答
差异核心原因
你遇到的两个代码片段的表现差异,是Swift闭包返回值规则和教程代码细节漏看共同导致的,具体解释如下:
1. 你编写的String类型闭包编译报错的原因
用于赋值的立即执行闭包(定义后紧跟()直接运行的闭包),返回值类型必须和变量声明的类型完全匹配。
你写的闭包内只有一行print("hello,world!"),而print函数的返回值为Void(空类型),和你声明的String类型不匹配,因此编译器会提示你需要返回String类型的值。
2. Core Data初始化代码可正常赋值的原因
你大概率漏看了教程代码闭包末尾的return container语句,标准的NSPersistentContainer初始化写法如下:
let persistentContainer: NSPersistentContainer = { let container = NSPersistentContainer(name: "Photorama") container.loadPersistentStores { (description, error) in if let error = error { print("Error setting up Core Data \(error)") } } return container // 教程代码大概率存在这行显式返回语句 }()
这里闭包最后显式返回了提前创建好的NSPersistentContainer实例,类型和变量声明完全匹配,因此可以正常赋值。
补充:Swift隐式返回规则
Swift 5.1之后支持单表达式闭包隐式返回:如果闭包内只有一行代码,可以省略return关键字,系统会自动将这行代码的执行结果作为返回值。比如下面的写法是合法的:
// 单表达式隐式返回String,无需显式写return let v: String = { "hello,world!" }()
如果闭包内有多行代码,则必须显式写return指定返回值,否则默认返回Void,赋值给非Void类型的变量时就会触发编译错误。
内容的提问来源于stack exchange,提问作者Alan Hoo
相关产品推荐
相关产品推荐

