2016-07-19 189 views
24

Questo deve essere un errore di base, ma non riesco a vedere ciò che è sbagliato in questo codice:ambiguo riferimento al membro '=='

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

Al momento della compilazione, ottengo questo messaggio:

Ambiguous reference to member '==' 

Confrontare un Int a 0 non mi sembra ambiguo, quindi cosa mi manca?

risposta

41

Il messaggio di errore è fuorviante. Il problema è che il compilatore ha nessuna informazione di quale tipo si riferiscono i valori .Zero, .NotZero.

Il problema è anche correlato a oggetti gestiti o il metodo valueForKey , si otterrebbe lo stesso messaggio di errore per

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

Il problema può essere risolto specificando un valore completamente digitato

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

o fornendo un contesto dal quale il compilatore può inferire il tipo:

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

È vero che aggiungendo il tipo funziona. Ma se invece di usare l'operatore ternario io uso il modulo if() {...} else {...} allora funziona senza il tipo. Non vedo davvero la differenza. Le informazioni a disposizione del compilatore per il tipo inferire sembra essere la stessa. – Michel

+0

@ Michel: qual è esattamente l'istruzione if/else che funziona senza il tipo? –

+0

Guardando ancora a quello che ho fatto, potrei aver dato il tipo ad un certo punto, quando dichiaro la variabile. Rendere ciò che hai scritto bene. – Michel

0

Rimuovere il bracciale sembra opere:

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

+0

La rimozione delle parentesi non fa alcuna differenza per me. – Michel