gpt4 book ai didi

ios - Swift 2.2 中的自定义模式匹配未按预期工作

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

关注此处的优秀博客文章:https://appventure.me/2015/08/20/swift-pattern-matching-in-detail/#sec-3-7我试过自定义模式匹配。让我们定义一个代表两种字符串的 enum:

enum LineType : String {
case Event = "event:"
case Data = "data:"
}

接下来,一个 String 扩展能够判断一个字符串是否以 LineType 的一个或另一个值开头:

extension String {
func isOfType(type: LineType) -> Bool {
return self.hasPrefix(type.rawValue)
}
}

然后自定义模式匹配函数,检查字符串是否为给定类型:

func ~= (pattern: LineType, value: String) -> Bool {
return value.isOfType(pattern)
}

最后,我们用这个例子来测试一下:

let testLine = "event:yada-yada-yada"

switch testLine {
case _ where testLine.characters.count == 0:
print("Empty")
case LineType.Event: // <--- Causes the error Enum case 'Event' is not a member of type 'String'
print("Event")
case LineType.Data: // <--- Causes the error Enum case 'Data' is not a member of type 'String'
print("Data")
default:
print("Unknown Type")
}

所以如果有人能告诉我我做错了什么......

提前致谢。

最佳答案

switch testLine {
case _ where testLine.characters.count == 0:
print("Empty")
case _ where testLine.isOfType(.Event): print("Event")
case _ where testLine.isOfType(.Data): print("Data")
default: print("Unknown Type")
}

/* prints
Event
*/

仍然,尝试重新排列它......

它看起来很糟糕,但正如预期的那样有效

enum LineType : String {
case Event = "event:"
case Data = "data:"
}
func ~= (pattern: LineType, value: String) -> Bool {
return value.hasPrefix(pattern.rawValue)
}


let testLine = "event:yada-yada-yada"
let e = LineType.Event
let d = LineType.Data
switch testLine {
case let s where s.characters.count == 0: print("Empty")
case e: print("Event")
case d: print("Data")
default: print("Unknown Type")
}
/* prints
Event
*/

这也应该有效

...
case { return LineType.Event }(): print("Event")
...

...
case { LineType.Event }(): print("Event")
...

关于ios - Swift 2.2 中的自定义模式匹配未按预期工作,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36343824/

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