2017-10-28 4 views
0

オプションではない値を指定すると、switch文のオプションとどのように一致させることができますか?例えばswitch文でオプションで一致する

:中

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 
} 

結果: '?文字列' タイプの

発現パターン各case ...

は「文字列」

タイプの値と一致することはできません私はpatternsswitchに迅速ドキュメントを読んだが、私は、この作品を作る方法を見つけるように見えることはできません。

私はこの問題を回避することができます知っているが、この作品を作る方法がなければならない...

編集

要求されたとして、ここに私の実際のユースケースがあります。すべてのテキストフィールドは、あなたが以下などのoptionalcaseに確認することができ、オプション...

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

これは実際にはあまりにも一般的な質問です。より具体的なものに直面する必要があります。あなたは*コードを投稿できますか? – dfd

+0

@dfdアップデートを参照してください。 – doovers

答えて

1

スウィフト4.0

であることに注意してください。 これがあなたを助けてくれることを願っています。実際のユースケースについては

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

:私は、すべての非nilの テキストフィールドの配列を作成します。これはあまりエラーが発生しやすいと番号またはの ご注文いただいた場合、容易に変更することができます

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() 
} 

:次に、あなたがファーストレスポンダをその 配列内の現在のテキストフィールドを検索し、リスト内の次のものを作ることができますテキストフィールドが変更されます。