Ответ 1
Аргумент 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 теперь можно использовать незанятые замыкания с одним выражением с невоимичными типами возврата. Таким образом, теперь он компилируется без ошибок:
self.managedObjectContext.performBlock {
self.managedObjectContext.save(nil)
// explicit "return" not needed anymore in Swift 1.2
}
(Конечно, лучше проверить фактическое значение возврата из операции сохранения.)