Swift - ' Bool'不是'Void&#39 ;?的子类型?

时间:2014-09-01 04:06:33

标签: swift

我收到以下错误:'Bool'不是'Void'的子类型

performBlock采用无参数的void闭包,并且方法本身只有一个参数,所以我应该能够使用以下语法进行闭包。为什么我得到这个编译错误?

workingManagedObjectContext.performBlock {
    self.workingManagedObjectContext.save(nil)

    self.managedObjectContext.performBlock {
       self.managedObjectContext.save(nil)
    }
}

1 个答案:

答案 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
}

(当然,实际上检查返回值仍然更好 来自保存操作。)