2014-09-01 61 views
15

我收到以下错误:'Bool'不是'虚空'的子类型Swift - 'Bool'不是'Void'的子类型吗?

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

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

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

回答

27

的参数performBlock是封闭不接受参数并且返回void (即没有返回值)。 如果闭包由单个表达式组成,则返回类型从 推断为该表达式的类型。的类型的

self.managedObjectContext.save(nil) 

Bool,不能隐式转换为Void。 为了解决这个问题,你可以添加一个明确的return语句:

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

或(更好),检查save操作的返回值,而不是忽略它:

self.managedObjectContext.performBlock { 
    var error : NSError? 
    if !self.managedObjectContext.save(&error) { 
     // report error 
    } 
} 

(和做相同的外层保存)。


更新:作为夫特1.2(6.3的Xcode),具有非空的返回类型未注释的单封表达,现在可以在空上下文中使用。因此,这也现在通过编译:

self.managedObjectContext.performBlock { 
    self.managedObjectContext.save(nil) 
    // explicit "return" not needed anymore in Swift 1.2 
} 

(当然,它仍然是更好的实际检查从保存操作的返回值 。)

相关问题