我收到以下错误:“Bool”不是“Void”的子类型
performBlock 接受一个没有参数的 void 闭包,而方法本身只有一个参数,所以我应该能够为我的闭包使用以下语法。为什么会出现此编译错误?
workingManagedObjectContext.performBlock {
self.workingManagedObjectContext.save(nil)
self.managedObjectContext.performBlock {
self.managedObjectContext.save(nil)
}
}
最佳答案
performBlock
的参数是一个不带参数并返回 Void 的闭包
(即没有返回值)。
如果闭包包含一个单个表达式,返回类型是从
该表达式的类型。
self.managedObjectContext.save(nil)
是 Bool
,不能隐式转换为 Void
。
要解决该问题,您可以添加显式 return 语句:
self.managedObjectContext.performBlock {
self.managedObjectContext.save(nil)
return
}
或者(更好)检查保存
操作的返回值而不是忽略它:
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
}
(当然还是实际检查返回值比较好 来自保存操作。)
关于Swift - 'Bool' 不是 'Void' 的子类型?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25598711/