你能在模式匹配的同时打开一个包含选项的元组吗



尝试做这样的事情。。。

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

其中,在上文中,aabb都已展开。

我能想到的最接近的是。。。

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)")

相关内容

最新更新