【问题标题】:Custom pattern matching in Swift 2.2 not working as expectedSwift 2.2 中的自定义模式匹配无法按预期工作
【发布时间】:2016-03-31 21:09:14
【问题描述】:

关注这里的优秀博文: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")
}

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

提前致谢。

【问题讨论】:

  • 对我来说看起来像一个错误,如果模式是枚举类型,它将无法编译。
  • @MartinR case { LineType.Event }(): print("Event") 解决问题...或者更好地定义常量 let e = LineType.Event; ...案例e:...

标签: ios swift swift2 switch-statement pattern-matching


【解决方案1】:
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")
...

【讨论】:

  • 谢谢,但这是我尽量避免的。因为它不是自定义模式匹配。自定义模式匹配的原理是调用switch case中的~=函数,每次都不写。无论如何,谢谢。
  • @Zaphod 看到我的更新,尽管我没有看到在那里使用自定义运算符的任何优势
  • 实际上~= 运算符是switch case 模式匹配中涉及的运算符。你不应该写它。查看问题开头的链接。
  • @Zaphod 让我们考虑作为一种解决方法。您的问题是有效的,我确认与您的行为相同(XCode 7.3)
  • @Zaphod 看来,问题在于无法初始化枚举。将枚举分配给常量可以解决问题...查看我的更新
【解决方案2】:

是的,除了使用.rawValue 之外没有其他解决方案。但你已经知道该怎么做了。

我在操场上进行了测试(使用 Xcode 7.3),我可以确认这不起作用。向所涉及的函数添加 public 修饰符也无济于事。我建议在Apple Bug Reporter 或更好的Swift Bug Reporter 提交错误报告(正如@OleBegemann 所建议的那样)。

【讨论】:

  • 谢谢你们俩。 { }() 的解决方法有效,但由于预期行为无效,我将向两个平台报告。
  • Apple 错误报告归档:#25485364 - Swift 错误报告:SR-1121
猜你喜欢
  • 2021-12-18
  • 2018-03-02
  • 2017-09-19
  • 1970-01-01
  • 1970-01-01
  • 2022-11-15
  • 1970-01-01
  • 2017-05-04
  • 1970-01-01
相关资源
最近更新 更多