2014-09-01 2 views
15

Я получаю следующее сообщение об ошибке: «Bool» не является подтипом «Void»Swift - «Bool» не является подтипом «Пустоты»?

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

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

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

ответ

27

Аргумент performBlock является замыканием не принимает никаких аргументов и не возвращаются Пустоты (т.е. возвращаемого значения). Если замыкание состоит из одного выражения , тип возвращаемого значения определяется из типом этого выражения. Тип

self.managedObjectContext.save(nil) 

является Bool, который не может неявно быть преобразованы в Void. Чтобы решить эту проблему, вы можете добавить явный обратный оператор:

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), Неаннотированные одной экспрессирующих затворы с типами без возврата Пустоты теперь могут быть использованы в недействительных контекстах. Так что это компилировать без ошибок:

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

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

Смежные вопросы