Если вы посмотрите на подпись для NSPredicate.init(block:)
, то увидите, что блок принимает два параметра и возвращает логическое значение: (Any?, [String : Any]?) -> Bool)
, а первый параметр действительно Any
.
В вашем первом примере вы используете принудительное приведение с as!
, поэтому оно работает (это может произойти сбой, если тип на самом деле не был Paint
упакован в Any
. Ваш второй пример выдает ошибку, потому чтоваша типовая аннотация неверна, компилятор ожидает, что первый параметр будет Any
, а не Paint?
; он действительно должен выдавать вам ошибку в строке выше, но кажется, что он первым перехватывает его в строке с возвратом.
Если вы хотите безопасно развернуть, это должно быть:
func CheckPaintExists(colorCode : String, applicationCode : String) {
let checkRequest = NSFetchRequest<NSFetchRequestResult>(entityName: "Paint")
checkRequest.predicate = NSPredicate(block: { (item, bindings) -> Bool in
guard let paint = item as? Paint else {
return false
}
return paint.ColorCode == colorCode
&& paint.ApplicationCode == applicationCode
})
checkRequest.includesSubentities = false;
//managedContext.count(for: ...)do further stuff
}