我有一個自定義的結構體,其中包含幾個字段,並且我希望在一個快速的switch
語句,所以我可以通過比較其中一個字段與正則表達式來自定義匹配。swift 4:模式將對象與元組相匹配(元組模式不能匹配非元組類型的值)
E.g.鑑於這種結構:
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有一些神奇的祕訣,用於與元組進行模式匹配。我能在這裏做什麼嗎?
'switch((someInstance.header,someInstance.text))'工作嗎? – vacawama
@vacawama這是一個很酷的想法。我嘗試了它,但不幸的是它沒有工作,仍然有'Tuple模式不能匹配...'錯誤 –