次のエラーが発生します:「Bool」は「Void」のサブタイプではありません
performBlockは引数のないvoidクロージャを取り、メソッド自体には1つの引数があるため、クロージャに次の構文を使用できるはずです。なぜこのコンパイルエラーが発生するのですか?
workingManagedObjectContext.performBlock {
self.workingManagedObjectContext.save(nil)
self.managedObjectContext.performBlock {
self.managedObjectContext.save(nil)
}
}
toの引数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
}
}
(そして、外側のレベルの保存についても同じことを行います)。
更新: Swift 1.2(Xcode 6.3)以降、Void以外の戻り値の型を持つ注釈のない単一式クロージャをVoidコンテキストで使用できるようになりました。したがって、これはエラーなしでコンパイルされます。
self.managedObjectContext.performBlock {
self.managedObjectContext.save(nil)
// explicit "return" not needed anymore in Swift 1.2
}
(もちろん、実際に保存操作からの戻り値を確認することをお勧めします。)
この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。
侵害の場合は、連絡してください[email protected]
コメントを追加