l -*_*c l 7 regex switch-statement swift swift5.7
如何在 switch case 模式语句中使用 Swift 文字正则表达式?
根据 WWDC 2022 演示幻灯片中的示例,以下内容预计可以编译并运行正常:
import Foundation
import RegexBuilder
switch "abc" {
case /\w+/:
print("matched!")
default:
print("not matched.")
}
Run Code Online (Sandbox Code Playgroud)
但是,会产生以下错误:
类型的表达式模式
Regex<Substring>无法匹配类型的值String
是否可以switch case通过某种方式修改带有 Swift 正则表达式文字表达式的语句以使其正常运行?如何在 switch case 模式语句中使用新的 Swift 5.7 正则表达式功能?
据我发现,“与语句中的正则switch表达式匹配”功能尚未实现,因为人们在争论确切的语义应该是什么。如果是这样的情况
switch "---abc---" {
case /\w+/:
print("foo")
default:
print("bar")
}
Run Code Online (Sandbox Code Playgroud)
switch 语句应该运行哪个分支?仅当整个字符串与正则表达式匹配时才算作匹配,还是仅当切换字符串的子字符串匹配时才算匹配?换句话说,是wholeMatch还是firstMatch?请参阅此处的更多讨论。
最终他们也没有得出结论,
该提案经过修改后已被接受(修改
~=暂时是子集化)。
因此,~=没有为 添加运算符Regex<Output>,因此您不能在 switch 中使用它。
如果您愿意,您可以自己添加它,如果您可以在两种语义之间做出决定:)例如:
func ~=(regex: Regex<Substring>, str: String) -> Bool {
// errors count as "not match"
(try? regex.wholeMatch(in: str)) != nil
}
Run Code Online (Sandbox Code Playgroud)