2014-09-01 62 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 
} 

(當然,它仍然是更好的實際檢查從保存操作的返回值 。)

相關問題