2014-09-02 11 views
11

Ho un paio di righe di codice di lavoro:Uso ambiguo di "??"

let email = User.sharedInstance.emailAddress ?? "" 
    accountEmailAddress.text = email 

User.sharedInstance è un'istanza non facoltativa della classe User. La sua proprietà emailAddress è facoltativa String?. accountEmailAddress è un UILabel.

Se provo a trasformare questo in una sola riga di codice:

accountEmailAddress.text = User.sharedInstance.emailAddress ?? "" 

ottengo l'errore del compilatore Swift "uso ambiguo di '??'".

Non riesco a capire cosa sia ambiguo riguardo l'uso dell'operatore a coalescenza nulla qui. Sto cercando di scoprire perché il compilatore si lamenta e, per curiosità, se c'è un modo per renderlo un one-liner pulito.

(Xcode 6 beta 6.)

Edit: la riproduzione minima in un parco giochi:

// Playground - noun: a place where people can play 
var foo: String? 
var test: String? 

// "Ambiguous use of '??'" 
foo = test ?? "ValueIfNil" 
+0

Suppongo che sia causato da un operando: 'NSString' e l'altro è' String', quindi non è possibile determinare il valore restituito. –

+1

Sia 'UILabel.text' che' User.emailAddress' sono 'String's. – akashivskyy

+1

Hmm, 'label.text = Opzionale (" forse ") ?? "sure" 'funziona per me ... – akashivskyy

risposta

18

Credo che questo è a causa della facoltatività della UILabel.text. L'operatore ?? ha 2 sovraccarichi: uno restituisce T e l'altro restituisce T?.

Poiché UILabel.text accetta sia String e String?, il compilatore non può decidere quale sovraccarico utilizzare, generando così un errore.

È possibile correggere questo errore specificando rigorosamente il tipo di risultato:

String(User.sharedInstance.emailAddress ?? "") 

(User.sharedInstance.emailAddress ?? "") as String 

// or, when String! will become String? in the next beta/gm 

(User.sharedInstance.emailAddress ?? "") as String? 

Tuttavia, il compilatore dovrebbe preferire automaticamente i tipi non opzionali in questo tipo di situazioni, quindi suggerisco di segnalare un bug su questo.

+2

È cattiva, buona cattura! –

+1

Grazie, questo sicuramente spiega cosa sta succedendo. Farò un bug report di Apple. –

+1

Apple mi ha appena informato che questo è stato risolto nella beta 7 e ho appena confermato che lo è. Risulta tutto quello che dovevo veramente fare era aspettare un giorno. Il senno di poi è meraviglioso! –