2015-05-30 8 views
7

Ich habe eine einfache switch-Anweisung, die nicht so einfach ist.Binärer Operator '~ =' kann nicht auf Operanden vom Typ 'String' und 'String?' Angewendet werden.

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

Hier bekomme ich Fehler, die ich Binary operator '~=' cannot be applied to operands of type 'String' and 'String?' in Titel erwähnt. Und ich habe keine Ahnung, warum es ein Problem ist, dass einer von ihnen ein optionales ist.

Antwort

8

Wegen Optional Chaining, bubble?.name hat Typ String?. Sie haben ein paar Optionen:

  • Verwenden "largeBubble"? in Ihrem case Ausdruck (Swift 2+ nur).
  • Überprüfen Sie, bevor Sie Ihre switchswitch tun, so dass das Schalterargument ein String anstelle von String? sein wird.
  • Verwenden bubble!.name (oder bubble.name wenn es ein SKPhysicsBody!), wenn Sie sind absolut sicher, dass es sein wird, nicht null
+0

Option # 4: 'switch (bubble? .name ??" unbekannt ") {...}'. –

+0

Sicher, aber dann wirst du einen unnötigen Vergleich mit der Zeichenfolge "unbekannt" in einigen Fällen machen :) Natürlich ist es wahrscheinlich so schnell, dass es keine Rolle spielt ... – jtbandes

+0

'bubble! .name' hat nicht funktioniert - Nun, nur in Kombination mit 'some()'. Dachte, deswegen gibt es immer auch einen Standard ... wenn der Name nicht gesetzt ist. – Jurik

3

Wie @jtbandes sagte, das Problem das Ergebnis bubble?.name ist Typs String? . Eine alternative Lösung, auf die gegeben denjenigen, ist die ~= Betreiber außer Kraft setzt ein String? und String als Argument zu nehmen, zum Beispiel:

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

Oder, um es generic:

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

'Equatable' würde ausreichen :) –

+0

Prost für das, ich habe meine Antwort aktualisiert. – ABakerSmith

1

„ Werte werden niemals implizit in einen anderen Typ konvertiert. Wenn Sie einen Wert in einen anderen Typ umwandeln müssen, explizit eine Instanz des gewünschten Typs machen.“

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

Hier Breite ist ein Integer-Typ durch String (Int) Funktion

0
in String umgewandelt wurde

In Swift 2.0 (Absender: UIButton) dann! für die switch string funktioniert.

let operation = sender.currentTitle! 

in Swift 2.0 (Sender: ANYOBJECT) dann !! für die switch string funktioniert.

let operation = sender.currentTitle!! 

Der Fehler, den ich gemacht habe, verwendet AnyObject anstelle von 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 
     } 

    } 
Verwandte Themen