swift中枚举成员值的表示形式?

swift中枚举成员值的表示形式?,swift,enums,Swift,Enums,我读到“枚举的case值是实际值,而不仅仅是编写原始值的另一种方式。”我对这句话感到困惑。如果案例本身是新类型,那么不应该初始化为: enum CompassPoint { case north, east, south, west } var compassHeading = CompassPoint.west let aVoidFooClosure = Foo.bax let aFooInstance = aVoidFooClosure() // invoke! This now h

我读到“枚举的case值是实际值,而不仅仅是编写原始值的另一种方式。”我对这句话感到困惑。如果案例本身是新类型,那么不应该初始化为:

enum CompassPoint {
case north, east, south, west
}

var compassHeading = CompassPoint.west
let aVoidFooClosure = Foo.bax
let aFooInstance = aVoidFooClosure()
  // invoke! This now have value 'Foo.bax' (empty tuple '()' associated value)
据苹果称,枚举不包括隐式初始值设定项。。这让我更加困惑

TLDR; 如果键入
枚举
案例
,其中
案例
具有关联值,则此
案例
的类型将是一个高阶函数,参数与关联值匹配,返回类型与
枚举
本身匹配。由于不同的案例允许具有不同类型(和数量)的关联值,因此键入的
枚举
案例
的类型自然会有所不同。这里的重要性在于区分
enum
实例(总是有一个给定的
case
作为值)和案例本身的显式类型(当不是值时)


枚举
实例始终与
案例
关联,并且始终具有
枚举
的类型 我不知道你的报价的来源,但很直接地将每个
案例描述为价值:

枚举为一组相关的值和值定义一个公共类型 使您能够以类型安全的方式在内部使用这些值 代码

enum
:具有不同关联值的大小写的类型化大小写将定义不同类型的高阶函数类型,所有类型都返回
enum
但是,除了
枚举
案例
实例的值视图之外,可能需要注意的是,每个
案例
(键入!)本身都有一个类型(尽管在
struct Foo{}
的意义上不是一个“新”类型),在相同
枚举
的不同案例之间可能有所不同。如果案例没有关联值,则此类型仅等于
enum
本身,但如果
case
使用关联值,则
case
的类型将是一个高阶函数类型,参数类型为关联值,返回类型为
enum
类型本身。由于不同的案例可以有不同的关联值,因此自然地,不同的案例可以对应不同的类型

或者,枚举案例可以指定任何 类型与每个不同的大小写值一起存储,就像联合一样 或者其他语言中的变体。您可以定义一组通用的 作为一个枚举的一部分的相关案例,每个枚举都有一个 与之关联的适当类型的不同值集

您可以定义Swift枚举来存储的关联值 任何给定的类型,并且值类型对于 如果需要,请单击枚举

现在,由于不同的案例具有不同的类型(当键入时,而不是作为
Foo
实例的一部分时),给定
case
到给定
enum
实例的“初始化”将根据
case
是否具有任何关联值而看起来不同

enum Foo {
    case bar
    case baz(Int) // Int associated value
    case bax()    // Void associated value
}

print(type(of: Foo.bar)) // Foo
print(type(of: Foo.baz)) // (Int) -> Foo
print(type(of: Foo.bax)) // () -> Foo

func foo(_ closure: (Int) -> Foo) -> Foo {
    return closure(42)
}

let foobaz = foo(Foo.baz) // 'foobar' is 'Foo.baz' (ass. value 42)

let foobar = foo(Foo.bar) // wont compile, type mismatch
let foobax = foo(Foo.bax) // wont compile, type mismatch
如您所见,没有关联值的
案例
实例只需键入
枚举
类型和案例即可实例化(因为此案例的类型将是
枚举
本身:与
Foo.bar
比较),而具有关联值的案例(甚至
()
)将需要在实例化时调用。这种调用,特别是对于上面的
bax()
案例,可能看起来很像某种隐式初始化,但它只是调用闭包类型来接收返回类型
Foo
的实例

enum Foo {
    case bar
    case baz(Int) // Int associated value
    case bax()    // Void associated value
}

var foo = Foo.bar // no associated values
foo = Foo.baz(42) // expects Int associated value: needs to be _invoked_(/called)
foo = Foo.bax()   // expects empty tuple '()' associated value: needs to be _invoked_(/called)
如果案例本身是新类型,那么不应该初始化为:

enum CompassPoint {
case north, east, south, west
}

var compassHeading = CompassPoint.west
let aVoidFooClosure = Foo.bax
let aFooInstance = aVoidFooClosure()
  // invoke! This now have value 'Foo.bax' (empty tuple '()' associated value)
这只是一个符号问题。但我认为你可以这样向自己证明

可以添加您似乎期望的初始值设定项,但您要初始化的是CompassWest,而不是特定情况:

var compassHeading = CompassPoint.west()
此外,如果CompassPoint的
west
案例有相关价值,那么您所要求的正是您会说的:

但由于没有案例具有关联值,因此所有
CompassPoint.west
对象实际上都是同一个对象。不维护任何状态-请记住,枚举没有存储的属性。所以这与实例化结构或类不同
CompassPoint.west
不是CompassPoint这种情况的一个实例;它是宇宙中唯一的
CompassPoint.west


(从这个意义上讲,case
.west
更像是一个结构的静态属性,而不是一个类的实例。因此引用它的符号就像引用结构的静态属性的符号。)

我在上找到了第一条语句,在苹果官方网站上找到了第二条语句。猜猜哪一个更可信?不是你在互联网上读到的所有东西都是真的那么这是否意味着枚举案例在调用它们之前就被初始化了呢?它们是枚举类型的实例吗?@code不同如果键入
枚举
案例
,其中
案例
具有关联值,则此
案例
的类型将是一个高阶函数,参数与关联值匹配,返回类型与
枚举
本身匹配。由于不同的案例允许具有不同类型(和数量)的关联值,因此键入的
enum
的类型自然会有所不同。这里的重要性在于区分
enum
实例(总是将给定的case作为值)和显式类型的case本身(如果不是值!)。因此,可以安全地假设case实例不必像具有
enum CompassPoint {
    case west(Int)
}
let cp = CompassPoint.west(25)