gpt4 book ai didi

开关盒中的 Swift 静态变量

转载 作者:行者123 更新时间:2023-11-28 10:53:15 25 4
gpt4 key购买 nike

用于比较 static var

switch-case 未按预期工作。但是,指定类型或直接比较是可行的。请看下面:

class AnimalHelper {
func loadAnimal(_ animal: Animal) {

// Doesn't compile
switch animal {
case .squirrel, .deer: loadGrass()
case .dolphin: return // not implemented
default: loadMeat()
}

// Direct comparison works
if animal == .squirrel || animal == .deer {
loadGrass()
} else if animal == .dolphin {
return // not implemented
} else {
loadMeat()
}

// Specifying the type explicitly also works
switch animal {
case Animal.squirrel, Animal.deer: loadGrass()
case Animal.dolphin: return // not implemented
default: loadMeat()
}
}

func loadGrass() {}
func loadMeat() {}
}

class Animal {
let id = 6 // Will be generated
let hasFourLegs = true
let numberOfEyes = 2
// ... //

static var squirrel: Animal { return .init() }
static var dolphin: Animal { return .init() }
static var puma: Animal { return .init() }
static var deer: Animal { return .init() }
}

extension Animal: Equatable {
public static func ==(lhs: Animal, rhs: Animal) -> Bool {
return lhs.id == rhs.id
}
}

我确定上面的某些内容不太正确,因为我收到以下编译错误:

Enum case 'squirrel' not found in type 'Animal'
Enum case 'deer' not found in type 'Animal'
Enum case 'dolphin' not found in type 'Animal'

请告诉我在 switch-case 中检查相等性与在 if 条件中检查相等性有何不同。

最佳答案

在 Swift 中,switch-case 可以使用几种不同的规则来匹配 switch 值和 case 标签:

  • enum 大小写匹配

    在这种情况下,您可以使用点引出的大小写标签,但不幸的是,您的Animal 不是enum

    (这与下面的相等不同,因为enum 案例可能有关联值。)

  • 模式匹配运算符~=

    Swift 在重载中搜索 switch 类型的值和 case 标签的类型,如果找到,则应用运算符并使用 Bool 结果表示匹配。为此,Swift 需要推断 case 的类型 - 独立于 switch 的标签,因此 Swift 无法推断 case 的类型- 以点为首的标签。

  • 等式==

    switch 的值是 Equatable 时,Swift 使用相等运算符 == 来匹配 switch -case-标签的值。

(可能还有很多我暂时想不起来了)

详细的行为没有明确定义,但编译器很难解决两个规则——模式匹配相等。 (您可能希望使用 ~=Equatable 类型定义自定义匹配。)

因此,在 Swift 3 中,case 标签中的点引导符号仅适用于 enum 类型。

但是,据我所知,Swift 4 已经做到了。试试 Xcode 9(目前最新的是 beta 3),你的代码就可以编译了。此行为可能会在 Xcode 9 的发行版中发生变化,但您知道如何解决。

关于开关盒中的 Swift 静态变量,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45155416/

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