尝试做这样的事情......
func test(a:Int?, b:Int?){
switch (a, b) {
case (nil, nil) : print("Neither")
case let (aa, nil) : print("A-only: \(aa)")
case let (nil, bb ) : print("B-only: \(bb)")
case let (aa, bb ) : print("A and B: \(aa) & \(bb)")
}
}
在上面的地方,aa
和 bb
都已经解包了。
我能想到的最接近的是...
func test(a:Int?, b:Int?){
switch (a, b) {
case (nil, nil) : print("Neither")
case ( _, nil) : print("A-only: \(a!)")
case (nil, _) : print("B-only: \(b!)")
default : print("A and B: \(a!) & \(b!)")
}
}
...但我真的很讨厌我有这样明确解包的值。
那么这可以做到吗?
最佳答案
您需要“可选模式”x?
:
func test(a:Int?, b:Int?) {
switch (a, b) {
case (nil, nil) : print("Neither")
case (let aa?, nil) : print("A-only: \(aa)")
case (nil, let bb?) : print("B-only: \(bb)")
case (let aa?, let bb?) : print("A and B: \(aa) & \(bb)")
}
}
x?
是 .some(x)
的快捷方式,所以你可以这样写
作为
func test(a:Int?, b:Int?) {
switch (a, b) {
case (nil, nil) : print("Neither")
case (let .some(aa), nil) : print("A-only: \(aa)")
case (nil, let .some(bb)) : print("B-only: \(bb)")
case (let .some(aa), let .some(bb)) : print("A and B: \(aa) & \(bb)")
}
}
正如@vacawama 所说,您还可以将 let
移到模式的外部:
case let (aa?, nil) : print("A-only: \(aa)")
case let (nil, bb?) : print("B-only: \(bb)")
case let (aa?, bb?) : print("A and B: \(aa) & \(bb)")
关于swift - 你能同时进行模式匹配和解包一个包含可选值的元组吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53001077/