gpt4 book ai didi

与协议(protocol)的 Swift 模式匹配

转载 作者:搜寻专家 更新时间:2023-11-01 05:34:24 24 4
gpt4 key购买 nike

不知道是编译器的错误还是有什么我不知道的。

在匹配具体类型时,我可以结合两种情况,例如:

    enum SomeEnum {
case a, b, c
}

let param: (SomeEnum, Any) = something
switch (param) {
case (.a, let param as Int),
(.b, let param as Int):
print("a or b with solid type (Int) \(param)")
default: print("none of above")
}

但是,如果我想匹配如下协议(protocol):

    switch (param) {
case (.a, let param as Equatable),
(.b, let param as Equatable):
print("a or b with protocol \(param)")
default: print("none of above")
}

我在编译期间得到 Segmentation fault: 11。解决方案是复制如下代码:

    switch (param) {
case (.a, let param as Equatable):
print("a or b with protocol \(param)")
case (.b, let param as Equatable):
print("a or b with protocol \(param)")
default: print("none of above")
}

有人能告诉我为什么它会这样吗?

最佳答案

有点搞砸了。

我很确定将 param 转换为 equatable 几乎没有用,不能以任何方式使用。我很惊讶它能正常工作,因为它需要 Self 并且在转换为普通变量时不起作用。

我猜编译器不应该能够执行其中的任一个,但您的第二个示例要么是意外运行的,要么是旧方法的残余。 (附带说明一下,Switch 模式匹配将进行大修,因此这可能很快会产生正确的编译器错误。)。

我在想第一个不起作用的原因与使用多选项 switch case 变量时定义变量的方式有关(那是满嘴的)。如果它试图将 Equatable 的两个不同实例设置为同一个变量,则底层类型可能是两种不同的类型,它甚至不应该尝试,但如果它尝试了,因为它在这里,它在内部破坏了一些东西。

我的猜测是 Swift 4 已经报告或修复了这个问题,但是在 Swift bug tracker 上提交雷达和/或报告不会有什么坏处。 :

关于与协议(protocol)的 Swift 模式匹配,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44328735/

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