swift 4:模式匹配元组对象元组(元组模式不能匹配非元组类型的值
发布时间:2020-12-14 04:56:30 所属栏目:百科 来源:网络整理
导读:我有一个带有几个字段的自定义结构,我想在 swift switch语句中对它进行模式匹配,这样我就可以通过将一个字段与正则表达式进行比较来自定义匹配. 例如.鉴于这种结构: struct MyStruct { let header: String let text: String} 我想像这样模式匹配: switch(s
我有一个带有几个字段的自定义结构,我想在
swift switch语句中对它进行模式匹配,这样我就可以通过将一个字段与正则表达式进行比较来自定义匹配.
例如.鉴于这种结构: struct MyStruct { let header: String let text: String } 我想像这样模式匹配: 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有一些神奇的秘诀,用于与元组相匹配的模式.我能在这做什么吗? 解决方法
你可以创建一个计算属性来返回一个元组:
struct MyStruct { let header: String let text: String var tuple: (String,String) { return (header,text) } } 然后你可以根据元组计算属性切换: switch(someInstance.tuple) { case ("h1","[a-z]+"): ... case ("h1","0-9+"): ... default: ... } 或者,如果您的意图是执行正则表达式匹配: switch(someInstance.tuple) { case ("h1",let string) where string.range(of: "^[a-z]+$",options: .regularExpression) != nil: print("alphabetic") case ("h1",let string) where string.range(of: "^[0-9]+$",options: .regularExpression) != nil: print("numeric") default: print("other") } 或者,如果这太多了,你可以为正则表达式模式匹配定义一些字符串函数,例如: extension String { func isMatch(regex pattern: String) -> Bool { return range(of: "^" + pattern + "$",options: .regularExpression) != nil } func contains(regex pattern: String) -> Bool { return range(of: pattern,options: .regularExpression) != nil } } 然后: switch(someInstance.tuple) { case ("h1",let string) where string.isMatch(regex: "[a-z]+"): print("alphabetic") case ("h1",let string) where string.isMatch(regex: "[0-9]+"): print("numeric") default: print("other") } 或者无论如何都要这样做,但这只是为了说明如果你想要元组匹配,你可以定义计算属性来返回元组,然后在where子句中做你想做的任何事情. (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |