2015-05-30 13 views
7

Ho una semplice istruzione di commutazione che non è così semplice.L'operatore binario '~ =' non può essere applicato agli operandi di tipo 'String' e 'String?'

switch(bubble?.name){ //bubble is SKPhysicsBody 
    case "largeBubble": // <= error 
     newBubbleSize = "medium" 
     break; 
    default: 
     newBubbleSize = "large" 
     break; 
} 

Qui ho l'errore che ho citato nel titolo Binary operator '~=' cannot be applied to operands of type 'String' and 'String?'. E non ho idea del perché sia ​​un problema che uno di essi sia opzionale.

risposta

8

A causa di Optional Chaining, bubble?.name ha tipo String?. Hai un paio di opzioni:

  • Uso "largeBubble"? nel case espressione (Swift 2+ solo).
  • Verificare la presenza di nil prima di fare il switch, quindi l'argomento dello switch sarà un String anziché String?.
  • Usa bubble!.name (o bubble.name se è un SKPhysicsBody!) se siete assolutamente sicuri che non sarà nullo
+0

Opzione n. 4: 'interruttore (bolla? .name ??" sconosciuto ") {...}'. –

+0

Certo, ma in alcuni casi eseguirai un confronto non necessario con la stringa "sconosciuto" :) Certo, probabilmente è così veloce che non importa ... – jtbandes

+0

'bubble! .name' non ha funzionato - bene, solo in combinazione con 'some()'. Per questo motivo c'è sempre un default ... se il nome non è impostato. – Jurik

3

Come @ Jtbandes detto, il problema è il risultato di avere bubble?.name tipo String? . Una soluzione alternativa, a quelle date, è quello di ignorare l'operatore ~= di prendere una String? e String come argomenti, ad esempio:

func ~= (lhs: String, rhs: String?) -> Bool { 
    return lhs == rhs 
} 

Oppure, per renderlo più generico:

func ~= <T: Equatable>(lhs: T, rhs: T?) -> Bool { 
    return lhs == rhs 
} 
+0

'Equitable' sarebbe sufficiente :) –

+0

Ciao, ho aggiornato la mia risposta. – ABakerSmith

1

“ I valori non vengono mai convertiti implicitamente in un altro tipo. Se avete bisogno di convertire un valore in un tipo diverso, fare in modo esplicito un'istanza del tipo desiderato.”

“let label = "The width is " 
let width = 94 
let widthLabel = label + String(width)” 

Ecco un tipo intero che è stato convertito in String da String funzione di larghezza (Int)

0

In Swift 2.0 (mittente: UIButton) quindi! per la stringa di commutazione funziona.

let operation = sender.currentTitle! 

In Swift 2.0, (mittente: ANYOBJECT) allora !! per la stringa di commutazione funziona.

let operation = sender.currentTitle!! 

l'errore che ho fatto è utilizzare AnyObject anziché UIButton.

@IBAction func operate(sender: AnyObject) { 
     let operation = sender.currentTitle!! 

     if userIsInTheMiddleOfTypeingNumber{ 
      enter() 
     } 

     switch operation{ 
      case "×": 
       if operandStack.count >= 2{ 
        displayValue = operandStack.removeLast() * operandStack.removeLast() 
       } 

       break 
//   case "÷": 
//    break 
//   case "+": 
//    break 
//   case "−": 
//    break 
      default: 
       break 
     } 

    }