gpt4 book ai didi

swift 4 : pattern match an object against a tuple (Tuple pattern cannot match values of the non-tuple type)

转载 作者:搜寻专家 更新时间:2023-10-30 22:17:11 28 4
gpt4 key购买 nike

我有一个包含几个字段的自定义结构,我想在快速 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 有一些神奇的 secret 调料,可以与阻碍的元组进行模式匹配。有什么我可以在这里做的吗?

最佳答案

你可以创建一个计算属性来返回一个元组:

struct MyStruct {
let header: String
let text: String

var tuple: (String, String) { return (header, text) }
}

然后您可以根据tuple 计算属性切换:

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 子句中做任何你想做的事情。

关于 swift 4 : pattern match an object against a tuple (Tuple pattern cannot match values of the non-tuple type),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46700045/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com