我收到以下错误:'Bool'不是'Void'的子类型
performBlock采用无参数的void闭包,并且方法本身只有一个参数,所以我应该能够使用以下语法进行闭包。为什么我得到这个编译错误?
workingManagedObjectContext.performBlock {
self.workingManagedObjectContext.save(nil)
self.managedObjectContext.performBlock {
self.managedObjectContext.save(nil)
}
}
答案 0 :(得分:27)
performBlock
的参数是一个不带参数的闭包并返回Void
(即没有返回值)。
如果闭包由单个表达式组成,则返回类型的返回类型
表达式的类型。
self.managedObjectContext.save(nil)
是Bool
,无法隐式转换为Void
。
要解决该问题,可以添加显式返回语句:
self.managedObjectContext.performBlock {
self.managedObjectContext.save(nil)
return
}
或(更好),检查save
操作的返回值而不是忽略它:
self.managedObjectContext.performBlock {
var error : NSError?
if !self.managedObjectContext.save(&error) {
// report error
}
}
(并对外层保存也这样做。)
更新:从Swift 1.2(Xcode 6.3)开始,带有非Void返回类型的未注释单表达式闭包现在可用于Void上下文。所以这现在编译没有错误:
self.managedObjectContext.performBlock {
self.managedObjectContext.save(nil)
// explicit "return" not needed anymore in Swift 1.2
}
(当然,实际上检查返回值仍然更好 来自保存操作。)