【问题标题】:Swift - 'Bool' is not a subtype of 'Void'?Swift - 'Bool' 不是 'Void' 的子类型?
【发布时间】:2014-09-01 04:06:32
【问题描述】:

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

performBlock 接受一个没有参数的 void 闭包,并且方法本身只有一个参数,所以我应该能够对我的闭包使用以下语法。为什么会出现这个编译错误?

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

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

【问题讨论】:

    标签: swift


    【解决方案1】:

    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
    }
    

    (当然最好还是实际检查返回值 来自保存操作。)

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2015-11-02
      • 2022-10-17
      • 2020-12-14
      • 1970-01-01
      • 2019-12-05
      • 2018-11-16
      • 2020-01-14
      • 1970-01-01
      相关资源
      最近更新 更多