给定一个非可选值,如何匹配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
...
我已经阅读了patterns和switch上的快速文档,但我似乎无法找到一种方法来完成这项工作。
我知道我可以解决这个问题,但必须有办法让这项工作......
修改
根据要求,这是我的实际用例。请注意,所有文本字段都是可选的......
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 :(得分: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()
}
这不容易出错,如果数字或数字很容易修改 文本字段的顺序发生了变化。