swift - 需要澄清Swift中的枚举类型

标签 swift enums

我试图理解swift中的枚举,但是我对变量的赋值感到困惑。下面是一个例子:

enum Planet {
    case Mercury, Venus, Earth, Mars, Jupiter, Saturn, Uranus, Neptune
}

var myPlanet = Planet.Mercury 

我对最后一句话感到困惑。MyPlanet变量是否被指定为以case mercury为值的行星对象?

最佳答案

它不是真正的行星“物体”,因为斯威夫特更喜欢“类型”这个词。“object”意味着它是“class”的一个实例,类、枚举和结构的线条与其他语言相比有点模糊。
Planet不是类,而是枚举-相关“成员值”的集合。你在逐字计算或“列举”组中的所有不同选项,并说出每个选项的名称。这为每个值提供了一个有用的别名,允许您按名称引用行星,而不是说“行星1、2、3、4、5…”
任何情况下,如果您拥有有限的相等选项集合,都可能是枚举的一个很好的候选者:“北、南、东、西”是另一个常见的例子。
这里要做的是声明一个新变量,并将其初始值赋给myPlanet枚举的成员值。未显式声明Planet类型,但根据上下文推断-此新变量的类型必须为Mercury才能保存所需的值。
另一种声明是:Planet
通过显式地将var的类型声明为Planet可以从右侧省略.Mercury
另外,由于它是一个var myPlanet: Planet = .Mercury而不是Planet你可以稍后将Planet更改为行星枚举的任何“成员值”。由于var只能是可能的let选项中的一个,因此只需引用成员值:
myPlanet
但是,您不能将myPlanet更改为其他类型(无论是枚举、结构还是类),因为它的类型已经定义为Planet
有关更多示例/详细信息,请参阅Swift Programming Language Guide的枚举一章(尽管这个示例是相同的,所以您可能正在阅读它)。
根据注释编辑:
对我来说,水星是指一种叫做行星的计数类型,里面只有水星。
您的myPlanet = .Earth变量属于planet类型,只分配了myPlanet值。”“行星。水星”作为一种说法,就像是指向“行星菜单,价值:水星”。
基本枚举是可能选项的列表,如菜单:

List of Planets to Choose From
1. Mercury
2. Venus
3. Earth
4. etc... 

变量Planet是一个一次只能有1个值的容器。
由于您将其设置为myPlanet枚举定义中列出的选项之一,Swift推断它必须是.Mercury类型。从这一点开始,这个容器被标记为“仅用于行星”,它的赋值只能来自枚举列表。myPlanet枚举本身是静态的-它是餐厅菜单,并且始终包含相同的选项(除非编辑枚举定义本身)。
如果我把它写成一个叫做行星的类,我会把它看作是我的行星=行星(名字:“水星”)。你有没有一个可以帮助我理解枚举概念的类比?–沃尔特
对于这个类示例,您将使用一个方法来初始化一个属性为“mercury”的Planet实例。这在很多方面是不同的。例如,在本例中,“name”是string类型的属性,它具有getter/setter方法等。您可以将Planet设置为您想要的任何值:Planet您还必须通过属性的名称访问该属性,并为其提供一个值。对于枚举来说,这是不正确的。
对于枚举,您所拥有的只是可能选项的预定义列表。
水星、金星、地球、火星等。枚举的“成员值”只是昵称,类似于“entry 1,entry 2,entry 3”的别名。如果“planet.walter”不在预先定义的列表中,则不能将planet类型的变量分配给该值。它知道必须是一个Planet但在选项中找不到。
另外,我仍然困惑的原因与访问枚举内的计算属性有关。例如,如果我有一个名为“大小”的计算属性,该属性基于枚举中的self,那么访问的方法是myplanet.size。这意味着它相当于行星水星的大小。如何通过case>value mercury访问计算属性?
计算属性是Swift模糊传统面向对象编程线条的一个地方,因为它们存在于类、枚举和结构中,因此容易混淆。
name不一定等于name—它可以是Planet.name = "Walter",其中size是从枚举本身内的函数返回的计算属性。
请参阅此问题以获取示例:
Swift Tour Card.createDeck() Returning [{(enum value), (enum value)}]
以下是卡组上未测试的变体示例:
enum Planet {
    case Mercury, Venus, Earth, Mars

    func size() -> String {
       switch self {
          case .Mercury:
            return "pretty darn small!"
          case .Venus:
            return "still small!"
          case .Earth:
            return "we think this is normal"
          case .Mars:
            return "slightly bigger than Earth"
      }
    }

}

var myPlanet: Planet = .Mercury
print(\myPlanet.size()) //"pretty darn small!"
myPlanet = .Mars
print(\myPlanet.size()) //"slightly bigger than Earth"

使用这种方法,“大小”函数是Planet枚举的一种方法,类似于对象可以有实例方法,或者结构也可以有方法。在分配一个值后调用case Walter就像说“我是一个类型行星,所以如果我看自己,我知道我是水星,所以当我执行这个方法时,我有,因为我是一个行星,我返回水星的值。”更改分配的值,方法保持不变,但返回的值现在是不同,因为我的星球现在有不同的价值。

关于swift - 需要澄清Swift中的枚举类型,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32172812/

相关文章:

ios - 字典(键,值)顺序

swift - 从具有多个 child 的 Firebase 数据库中检索

java - spring 4 枚举作为 Controller 参数

c++ - 头文件中的外部枚举

不能使用 header 枚举

swift - 在 Swift 中更改父类(super class)变量

swift - 为 Structs Swift 改变中缀函数

ios - 如何在 Swift 中使用 reachabilityWithHostName?

c# - 拆分枚举标志以在集合中创建不同项目的有效方法

rust - 匹配一只 ARM 中的两个枚举变体,使用 Option? 绑定(bind)一个变体的字段?