gpt4 book ai didi

Swift - 'Bool' 不是 'Void' 的子类型?

转载 作者:IT王子 更新时间:2023-10-29 05:18:49 26 4
gpt4 key购买 nike

我收到以下错误:“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/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com