2016-07-19 12 views
24

To musi być podstawowym błędem, ale nie mogę zobaczyć, co jest nie tak w tym kodzie:Niejednoznaczne odniesienie do członka „==”

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

w czasie kompilacji, otrzymuję komunikat:

Ambiguous reference to member '==' 

Porównanie Int do 0 nie wydaje mi się niejednoznaczne, więc czego mi brakuje?

Odpowiedz

41

Błąd wiadomość jest mylące. Problem polega na tym, że kompilator ma brak informacji, do jakiego typu odnoszą się wartości .Zero, .NotZero.

Problemem jest także powiązana z zarządzanych obiektów lub metody valueForKey , co można uzyskać ten sam komunikat o błędzie dla

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

problem może być rozwiązany poprzez określenie w pełni wpisane wartości

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

lub przez podanie kontekstu, w którym kompilator może wywnioskować typ:

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

To prawda, że ​​dodając typ, działa. Ale jeśli zamiast używać potrójnego operatora, używam formularza if() {...} else {...}, to działa bez typu. Nie widzę różnicy. Informacje do dyspozycji kompilatora do wnioskowania typu wydają się być takie same. – Michel

+0

@Michel: Czym dokładnie jest instrukcja if/else, która działa bez typu? –

+0

Patrząc ponownie na to, co zrobiłem, mogłem podać typ w pewnym momencie, kiedy zadeklarowałem zmienną. Robienie tego, co napisałeś dobrze. – Michel

0

Usuń bransoletkę wydaje prac:

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

+0

Usunięcie nawiasów nie ma dla mnie znaczenia. – Michel

Powiązane problemy