2017-10-28 1 views
0

Bei einem nicht optionalen Wert, wie kann ich mit einem optionalen in einer switch-Anweisung übereinstimmen?Match optional in switch-Anweisung

Zum Beispiel:

let test = "some string" 

let x: String? = nil 
let y: String? = "some string" 
let z: String? = "another string" 

switch test { 
case x: 
    print(x) 
case y: 
    print(y) 
case z: 
    print(z) 
default: break 
} 

Ergebnisse in: 'String'

Expressionsmuster von Typ können keine Werte vom Typ ‚String‘ entsprechen den schnellen docs auf patterns und switch aber ich kann nicht scheinen zu finden, einen Weg, um diese Arbeit zu machen

für jeden case ...

Ich habe gelesen.

Ich weiß, ich kann dieses Problem umgehen, aber es muss ein Weg, um diese Arbeit zu machen ...

bearbeiten

Wie gewünscht, hier mein eigentlicher Anwendungsfall ist. Beachten Sie alle Textfelder sind optional ...

func textFieldShouldReturn(_ textField: UITextField) -> Bool { 
     // TODO: Replace with switch if possible 

//  switch textField { 
//  case nameTextField: 
//   usernameTextField?.becomeFirstResponder() 
//  case usernameTextField: 
//   dateOfBirthTextField?.becomeFirstResponder() 
//  case dateOfBirthTextField: 
//   phoneTextField?.becomeFirstResponder() 
//  case phoneTextField: 
//   phoneTextField?.resignFirstResponder() 
//  default: break 
//  } 

     if textField == nameTextField { 
      usernameTextField?.becomeFirstResponder() 
     } else if textField == usernameTextField { 
      dateOfBirthTextField?.becomeFirstResponder() 
     } else if textField == dateOfBirthTextField { 
      phoneTextField?.becomeFirstResponder() 
     } else if textField == phoneTextField { 
      phoneTextField?.resignFirstResponder() 
     } 
     return false 
    } 
+0

Für mich ist das eigentlich zu allgemein eine Frage. Sie müssen mit etwas spezifischerem konfrontiert werden - etwas weniger "theoretisch". Könnten Sie * diesen * Code posten? – dfd

+0

@dfd Siehe Aktualisierung. – doovers

Antwort

1

Swift 4,0

Sie mit optionalcase als wie unten überprüfen. Hoffe das wird dir helfen.

let test = "some string" 

let x: String? = nil 
let y: String? = "some string" 
let z: String? = "another string" 

switch test { 
case let val where val == x: 
    print(x) 
case let val where val == y: 
    print(y) 
case let val where val == z: 
    print(z) 
default: 
    break 
} 
1

Für Ihren konkreten Anwendungsfall: Ich würde ein Array aller Nicht-Null Textfelder erstellen. Dann können Sie das aktuelle Textfeld Nachschlagen in diesem Array und machen die nächsten in der Liste die Ersthelfer:

let fields = [nameTextField, usernameTextField, dateOfBirthTextField, phoneTextField] 
    .flatMap { $0 } 
if let idx = fields.index(of: textField), idx + 1 < fields.count { 
    fields[idx + 1].becomeFirstResponder() 
} else { 
    textField.resignFirstResponder() 
} 

Dies ist weniger fehleranfällig und leicht, wenn die Anzahl oder Reihenfolge der modifiziert werden kann, Textfelder ändert sich.