在switch语句中匹配可选项

时间:2017-10-28 04:00:15

标签: swift switch-statement optional swift4

给定一个非可选值,如何匹配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
}

结果:

  

“String?”类型的表达式模式不能匹配'String'类型的值

为每个case ...

我已经阅读了patternsswitch上的快速文档,但我似乎无法找到一种方法来完成这项工作。

我知道我可以解决这个问题,但必须有办法让这项工作......

修改

根据要求,这是我的实际用例。请注意,所有文本字段都是可选的......

    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
    }

2 个答案:

答案 0 :(得分:2)

Swift 4.0

您可以查看optional case,如下所示。 希望这会对你有所帮助。

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 :(得分:1)

对于你的实际用例:我会创建一个非零的数组 文本字段。然后,您可以在其中查找当前文本字段 数组并使列表中的下一个成为第一个响应者:

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

这不容易出错,如果数字或数字很容易修改 文本字段的顺序发生了变化。