是否可以在switch-case
分支中使用选项?例如:某些功能f(arg:)
返回String?
。当f(arg:)
返回非nil值并使用此值时,我们需要执行一些switch-case
分支。请参阅以下示例。
func f(arg: Int) -> String?
let someValue: Int = ...
switch someValue {
case -3, -2, -1:
print("error: negative")
case 10, 11, 12:
print("error: too big")
case let value, let str = f(arg: value): // HOW ????
print("success: non-nil string (str)")
default:
print("fail")
}
我认为您的switch
语句等同于此:
switch someValue {
case -3, -2, -1:
print("error: negative")
case 10, 11, 12:
print("error: too big")
default:
if let str = f(arg: someValue) {
print("success: non-nil string (str)")
} else {
print("fail")
}
}
但是,一种使用guard
语句的清洁方式,因此您知道someValue
在将其传递给函数之前是有效的:
guard case 0...9 = someValue else {
print("someValue is outside of valid range")
// Handle error
return
}
if let str = f(arg: someValue) {
print("success: non-nil string (str)")
} else {
print("fail")
}
另一种选择是如果参数不在预期范围内,则简单地使f
返回nil
:
func f(arg: Int) -> String? {
guard case 0...9 = arg else {
print("(arg) is not in the valid range of 0...9")
return nil
}
// ...
}
if let str = f(arg: someValue) {
print("success: non-nil string (str)")
} else {
print("fail")
}
旧一个,但这可能是您想要的:
func f(arg: Int) -> String?
let someValue: Int = ...
switch (someValue, f(arg: value)) {
case (-3 ... -1, _):
print("error: negative")
case (10...12, _):
print("error: too big")
case (_, let str?):
print("success: non-nil string (str)")
default:
print("fail")
}