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

标签 swift

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

相关文章:

swift - 更改 IBOutlet (UIImageView) 的宽度

swift - 显示登录用户特有的收藏夹

ios - 如何转换 AnyObject?在 Swift 1.2 中转换为字符串

swift - RxSwift 以及如何制作简单的 TableViewController?

arrays - 如何使用 Swift Decodable 自定义解码数组的每个元素

ios - 如何使用自定义标题单元格将表格 View 单元格按字母顺序排列成部分?

objective-c - 如何使 Swift 类符合 Objective-C 协议(protocol),而不将其暴露给 Objective-C?

swift - 枚举大小写隐藏内置类型名称

swift - PFQueryTableViewController 查询指向 User 类的指针并将其作为用户名标签放入表中(Swift,Parse)

swift - 无法为特定设备自定义 UITableViewCell