Swift - "Bool" не является подтипом "Пустоты"?

Я получаю следующую ошибку: "Bool" не является подтипом "Void"

executeBlock принимает закрытие void без аргумента, а сам метод имеет единственный аргумент, поэтому я должен использовать следующий синтаксис для моего закрытия. Почему я получаю эту ошибку компиляции?

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

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

Ответы

Ответ 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
}

(Конечно, лучше проверить фактическое значение возврата из операции сохранения.)