我有一个带有几个字段的自定义结构,我想快速对其进行模式匹配switch
语句,以便我可以通过将其中一个字段与正则表达式进行比较来自定义匹配。
例如。鉴于此结构:
struct MyStruct {
let header: String
let text: String
}
I'd like像这样的模式匹配:
switch(someInstance) {
case ("h1", "[a-z]+"): ...
case ("h1", "0-9+"): ...
}
我尝试使用模式匹配函数来使其工作,如下所示:
func ~=(pattern: (String, String), value: MyStruct) -> Bool {
return value.header == pattern.0 && value.text.range(of: pattern.1, options: .regularExpression) != nil
}
但是 Xcode (9) 无法编译并出现以下错误:
元组模式无法匹配非元组类型“MyStruct”的值
我能够实现的最好成绩如下:
struct MatchMyStruct {
let header: String
let regex: String
init(_ header: NSString, _ regex: String) {
self.header = header
self.regex = regex
}
}
func ~=(pattern: MatchMyStruct, value: MyStruct) -> Bool {
return value.header == pattern.header && value.text.range(of: pattern.regex, options: .regularExpression) != nil
}
这让我可以像这样进行模式匹配:
switch(someInstance) {
case MatchMyStruct("h1", "[a-z]+"): ...
case MatchMyStruct("h1", "0-9+"): ...
}
虽然这是功能性的,但我更不想拥有MatchMyStruct
像这样明确的包装器。
似乎 Swift 有一些神奇的秘密武器可以与阻碍的元组进行模式匹配。我在这里可以做些什么吗?