2016-07-19 2 views
24

Это должна быть основной ошибкой, но я не могу видеть, что неправильно в этом коде:Неоднозначность ссылки на член «==»

.... object is some NSManagedObject .... 
let eltType = ((object.valueForKey("type")! as! Int) == 0) ? .Zero : .NotZero 

во время компиляции, я получаю сообщение:

Ambiguous reference to member '==' 

Сравнение Int с 0 не кажется мне двусмысленным, так что мне не хватает?

ответ

41

Ошибка сообщение вводит в заблуждение. Проблема в том, что компилятор имеет нет информации, какой тип значения .Zero, .NotZero см.

Проблема также связана с управляемыми объектами или методом valueForKey , вы получите такое же сообщение об ошибке для

func foo(value: Int) { 
    let eltType = value == 0 ? .Zero : .NotZero // Ambiguous reference to member '==' 
    // ... 
} 

Проблема может быть решена путем задания полностью набранный значение

let eltType = value == 0 ? MyEnum.Zero : .NotZero 

или путем предоставления контекста, из которого изготовитель может вывести тип:

let eltType: MyEnum = value == 0 ? .Zero : .NotZero 
+1

Верно, что добавив тип, он работает. Но если вместо использования тернарного оператора я использую форму if() {...} else {...}, то он работает без типа. Я не совсем понимаю разницу. Информация, находящаяся в распоряжении компилятора для ввода типа, кажется одинаковой. – Michel

+0

@Michel: Что такое оператор if/else, который работает без типа? –

+0

Глядя снова на то, что я сделал, я мог бы дать тип в какой-то момент, когда объявляю переменную. Создание того, что вы написали правильно. – Michel

0

Удалить браслет, кажется работ:

let eltType = (object.valueForKey("type")! as! Int) == 0 ? .Zero : .NotZero

+0

Удаление скобок для меня не имеет значения. – Michel

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