斯威夫特殊教育程之枚举,例子代码

By admin in 4858.com on 2019年4月16日

枚举

苹果官方文书档案 枚举

苹果官方文书档案中文翻译 枚举

枚举

C语言中,C枚举将有关称号分配给一组整数值,而Swift枚举不必为种种枚举值提供三个值。若为每种枚举值提供了值(称为原始值),则该值能够是字符串、字符或任何整数或浮点类型的值。

枚举还足以内定与种种枚举值一齐存款和储蓄的别的类型的关联值,那与别的语言中的联合或变体相同。

斯威夫特中的枚举具备守旧上仅由类帮忙的多数功力,例如计量属性来提供当前枚举值的叠加音信,以及实例方法来提供与枚举值的连带职能。

枚举

C语言中,C枚举将相关称号分配给一组整数值,而Swift枚举不必为每种枚举值提供2个值。若为种种枚举值提供了值(称为原始值),则该值能够是字符串、字符或任何整数或浮点类型的值。

枚举还足以钦点与各样枚举值一同存款和储蓄的其余类型的涉嫌值,那与此外语言中的联合或变体同样。

Swift中的枚举具备守旧上仅由类帮忙的多多作用,例如计量属性来提供当前枚举值的叠加音信,以及实例方法来提供与枚举值的连带职能。

<br />

一经你了然 C 语言,你会清楚在 C
语言中,枚举会为一组整型值分配相关联的名称。Swift中的枚举越来越灵活,不必给每三个枚举成员提供三个值。假使给枚举成员提供二个值(称为“原始”值),则该值的连串能够是字符串,字符,或是三个整型值或浮点数。

枚举语法

enum SomeEnumeration {
    // enumeration definition goes here
}

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

var directionToHead = CompassPoint.west

directionToHead = .east

enum Planet {
    case mercury, venus, earth, mars, jupiter, saturn, uranus, neptune
}

枚举语法

使用Enum第二字注脚枚举:

enum SomeEnumeration {
    // enumeration definition goes here
}

以下是指南针的多个趋势的事例:

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

使用case关键字引进新的枚举处境。

注意

与C和Objective-C分化,Swift的枚举值不会在创设时分配暗中同意整数值。上述枚举值不会隐式地等于0、1、贰、三。

多个case能够写在一行,用逗号隔离:

enum Planet {
    case mercury, venus, earth, mars, jupiter, saturn, uranus, neptune
}

各个枚举都以3个全新的项目,像任何品类同样,名称以大写字母初始,且为单数而非复数名称。

var directionToHead = CompassPoint.west

利用枚举类型将某些枚举值开始化时,斯维夫特会估算其具体枚举类型,下次再一次赋值时,可忽略枚举类型。使用点语法:

directionToHead = .east

斯威夫特殊教育程之枚举,例子代码。枚举语法

使用Enum首要字注明枚举:

enum SomeEnumeration {
    // enumeration definition goes here
}

以下是指南针的八个样子的例证:

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

使用case重点字引进新的枚举情形。

注意

与C和Objective-C不一致,斯维夫特的枚举值不会在开登时分配暗中同意整数值。上述枚举值不会隐式地等于0、1、二、叁。

多个case能够写在一行,用逗号隔断:

enum Planet {
    case mercury, venus, earth, mars, jupiter, saturn, uranus, neptune
}

各种枚举都以1个斩新的花色,像其余体系同样,名称以大写字母初步,且为单数而非复数名称。

var directionToHead = CompassPoint.west

采取枚举类型将有个别枚举值开端化时,Swift会估算其实际枚举类型,下次再次赋值时,可忽略枚举类型。使用点语法:

directionToHead = .east

<br />

除此以外,枚举成员能够钦赐任意档次的关联值存储到枚举成员中,就像别的语言中的联合体(unions)和变体(variants)。你能够在叁个枚举中定义1组有关的枚举成员,每一个枚举成员都得以有适量类型的涉及值。

运用Switch语句来相称枚举值

directionToHead = .south
switch directionToHead {
    case .north:
        print("Lots of planets have a north")
    case .south:
        print("Watch out for penguins")
    case .east:
        print("Where the sun rises")
    case .west:
        print("Where the skies are blue")
}
// prints "Watch out for penguins"

一旦不可能为持有枚举成员都提供2个 case,那您也能够提供三个 default
景况来含有这多少个不可能被明显写出的分子:

let somePlanet = Planet.earth
switch somePlanet {
    case.earth:
        print("Mostly harmless")
    default:
        print("Not a safe place for humans")
}
// Prints "Mostly harmless"

行使Switch语句相称枚举值

使用switch语句相称单个枚举值:

directionToHead = .south
switch directionToHead {
case .north:
    print("Lots of planets have a north")
case .south:
    print("Watch out for penguins")
case .east:
    print("Where the sun rises")
case .west:
    print("Where the skies are blue")
}
// Prints "Watch out for penguins"

switch言语必须归纳富有未有枚举值,不然不只怕透过编写翻译,确认保障有个别枚举景况不会被意外省略。

使用default涵盖未显明处理的别样枚举值:

let somePlanet = Planet.earth
switch somePlanet {
case .earth:
    print("Mostly harmless")
default:
    print("Not a safe place for humans")
}
// Prints "Mostly harmless"

应用Switch语句相称枚举值

使用switch语句相配单个枚举值:

directionToHead = .south
switch directionToHead {
case .north:
    print("Lots of planets have a north")
case .south:
    print("Watch out for penguins")
case .east:
    print("Where the sun rises")
case .west:
    print("Where the skies are blue")
}
// Prints "Watch out for penguins"

switch说话必须总结具有未有枚举值,不然相当的小概透过编译,确认保障有些枚举意况不会被意本省略。

使用default包含未明朗处理的其余枚举值:

let somePlanet = Planet.earth
switch somePlanet {
case .earth:
    print("Mostly harmless")
default:
    print("Not a safe place for humans")
}
// Prints "Mostly harmless"

<br />

在 Swift中,枚举类型是一等(first-class)类型。它们利用了众多在观念上只被类(class)所协理的天性,例如总结属性(computed
properties),用于提供枚举值的附加消息,实例方法(instance
methods),用于提供和枚举值相关联的效能。枚举也得以定义构造函数(initializers)来提供三个初阶值;能够在本来达成的基础上扩展它们的作用;仍是能够根据协议(protocols)来提供正规的功能。

关联值

enum Barcode {
    case upc(Int, Int, Int, Int)
    case qrCode(String)
}
var productBarcode = Barcode.upc(8, 85909, 51226, 3)
productBarcode = .qrCode("ABCDEFGHIJKLMNOP")

switch productBarcode {
    case .upc(let numberSystem, let manufacturer, let product, let check):
        print("UPC: \(numberSystem), \(manufacturer), \(product), \(check).")
    case .qrCode(let productCode):
        print("QR code: \(productCode).")
}
// Prints "QR code: ABCDEFGHIJKLMNOP."

要是对于1个枚举成员的兼具的相关值都被提取为常量,或只要都被提取为变量,为了简洁,你能够用3个独立的
var或 let在成员名称前标注:

switch productBarcode {
case let .upc(numberSystem, manufacturer, product, check):
    print("UPC : \(numberSystem), \(manufacturer), \(product), \(check).")
case let .qrCode(productCode):
    print("QR code: \(productCode).")
}
// Prints "QR code: ABCDEFGHIJKLMNOP."

关联值

神迹能够将别的门类的值和枚举值一同涉及起来,与枚举值一同存款和储蓄,并在历次使用该音信时,该信息会爆发变化。

以下为引导关联值的条形码枚举:

enum Barcode {
    case upc(Int, Int, Int, Int)
    case qrCode(String)
}

提到值不提供项目标实际值,只提供枚举值存款和储蓄的关联值的类型。

使用一下任一类型创设枚举值:

var productBarcode = Barcode.upc(8, 85909, 51226, 3)

productBarcode = .qrCode("ABCDEFGHIJKLMNOP")

使用switch领取关联值:

switch productBarcode {
case .upc(let numberSystem, let manufacturer, let product, let check):
    print("UPC: \(numberSystem), \(manufacturer), \(product), \(check).")
case .qrCode(let productCode):
    print("QR code: \(productCode).")
}
// Prints "QR code: ABCDEFGHIJKLMNOP."

关联值全被提取为常量或变量:

switch productBarcode {
case let .upc(numberSystem, manufacturer, product, check):
    print("UPC : \(numberSystem), \(manufacturer), \(product), \(check).")
case let .qrCode(productCode):
    print("QR code: \(productCode).")
}
// Prints "QR code: ABCDEFGHIJKLMNOP."

关联值

神跡可以将其余品类的值和枚举值一同涉嫌起来,与枚举值一齐存款和储蓄,并在每便使用该新闻时,该信息会发生变化。

以下为指点关联值的条形码枚举:

enum Barcode {
    case upc(Int, Int, Int, Int)
    case qrCode(String)
}

涉及值不提供项指标实际值,只提供枚举值存款和储蓄的关联值的项目。

接纳一下任1类型创制枚举值:

var productBarcode = Barcode.upc(8, 85909, 51226, 3)

productBarcode = .qrCode("ABCDEFGHIJKLMNOP")

使用switch领到关联值:

switch productBarcode {
case .upc(let numberSystem, let manufacturer, let product, let check):
    print("UPC: \(numberSystem), \(manufacturer), \(product), \(check).")
case .qrCode(let productCode):
    print("QR code: \(productCode).")
}
// Prints "QR code: ABCDEFGHIJKLMNOP."

关联值全被提取为常量或变量:

switch productBarcode {
case let .upc(numberSystem, manufacturer, product, check):
    print("UPC : \(numberSystem), \(manufacturer), \(product), \(check).")
case let .qrCode(productCode):
    print("QR code: \(productCode).")
}
// Prints "QR code: ABCDEFGHIJKLMNOP."

<br />

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

原始值

枚举成员能够用同1类其他默许值预先填充(称为原始值)。

enum ASCIIControlCharacter: Character {
    case tab = "\t"
    case lineFeed = "\n"
    case carriageReturn = "\r"
}

原始值

枚举值可以行使项目壹致的暗中认可值(即原始值)填充。

enum ASCIIControlCharacter: Character {
    case tab = "\t"
    case lineFeed = "\n"
    case carriageReturn = "\r"
}

原始值可以是字符串、字符或别的整数或浮点数类型,各样原始值必须是绝无仅有的。

原始值

枚举值能够接纳项目1致的暗中同意值(即原始值)填充。

enum ASCIIControlCharacter: Character {
    case tab = "\t"
    case lineFeed = "\n"
    case carriageReturn = "\r"
}

原始值能够是字符串、字符或别的整数或浮点数类型,各种原始值必须是绝无仅有的。

注意
与 C 和 Objective-C 不相同,Swift的枚举成员在被创立时不会被授予二个默许的整型值。在上边的CompassPoint例子中,north,south,east和west不会被隐式地赋值为0,一,二和三。相反,那么些枚举成员自个儿就是万事俱备的值,这一个值的品种是已经赫赫有名概念好的CompassPoint类型。

隐式钦点的原始值

当你在操作存款和储蓄整数或字符串原始值枚举的时候,你不用显式地给每八个分子都分配二个原始值。当你未曾分配时,Swift将会自行为您分配值。

enum Planet: Int {
    case mercury = 1, venus, earth, mars, jupiter, saturn, uranus, neptune
}

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

let earthsOrder = Planet.Earth.rawValue
    // earthsOrder is 3

let sunsetDirection = CompassPoint.west.rawValue
    // sunsetDirection is "west"

隐式分配枚举值

毋庸为每一个枚举值显示分配原始值,斯维夫特会自动分配。

平头用于原始值时,第一个枚举值自动安装为0,之后递增一。

enum Planet: Int {
    case mercury = 1, venus, earth, mars, jupiter, saturn, uranus, neptune
}

地点例子中,Planet.Planet具备显式原始值1,其余为隐式枚举值是在其基础上递增一。

字符串作为原始值时,每种枚举值的涵盖原始值是该枚举值的字符串字面量。

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

地点例子中,CompassPoint.south的隐式原始值为“south”,由此及彼。

采用枚举类型的rawValue天性获取其枚举值的原始值:

let earthsOrder = Planet.earth.rawValue
// earthsOrder is 3

let sunsetDirection = CompassPoint.west.rawValue
// sunsetDirection is "west"

隐式分配枚举值

不必为种种枚举值呈现分配原始值,斯维夫特会自动分配。

平头用于原始值时,第一个枚举值自动安装为0,之后递增一。

enum Planet: Int {
    case mercury = 1, venus, earth, mars, jupiter, saturn, uranus, neptune
}

地点例子中,Planet.Planet不无显式原始值一,别的为隐式枚举值是在其基础上递增1。

字符串作为原始值时,各类枚举值的盈盈原始值是该枚举值的字符串字面量。

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

地点例子中,CompassPoint.south4858.com ,的隐式原始值为“south”,由此及彼。

行使枚举类型的rawValue质量获取其枚举值的原始值:

let earthsOrder = Planet.earth.rawValue
// earthsOrder is 3

let sunsetDirection = CompassPoint.west.rawValue
// sunsetDirection is "west"

多少个成员值可以出现在同一行上,用逗号隔离:

从原始值起首化

用原始值类型来定义一个枚举,那么枚举就会活动接到贰个还行原始值类型的值的开端化器(叫做rawValue的方式参数)然后回到3个枚举成员要么
nil

let possiblePlanet = Planet(rawValue: 7)
    // possiblePlanet is of type Planet? and equals Planet.Uranus

原始值开端化器是三个可难倒初阶化器

let positionToFind = 11
if let somePlanet = Planet(rawValue: positionToFind) {
    switch somePlanet {
    case .earth:
        print("Mostly harmless")
    default:
        print("Not a safe place for humans")
    }
} else {
    print("There isn't a planet at position \(positionToFind)")
}
// Prints "There isn't a planet at position 11"

用原始值开端化枚举值

若使用原始值类型定义枚举,枚举会自动创立一个开端化器,并可因而原始值的早先化器创设枚举的实例。

let possiblePlanet = Planet(rawValue: 7)
// possiblePlanet is of type Planet? and equals Planet.uranus

但是,并不是兼具的原始值都能找到相配的枚举值,所以原始值开端化器(可难倒的早先化器)总是回到枚举的可选类型,可组合可选绑定和switch讲话处理该可选类型。

let positionToFind = 11
if let somePlanet = Planet(rawValue: positionToFind) {
    switch somePlanet {
    case .earth:
        print("Mostly harmless")
    default:
        print("Not a safe place for humans")
    }
} else {
    print("There isn't a planet at position \(positionToFind)")
}
// Prints "There isn't a planet at position 11"

用原始值初阶化枚举值

若使用原始值类型定义枚举,枚举会自动创造八个伊始化器,并可经过原始值的起首化器创立枚举的实例。

let possiblePlanet = Planet(rawValue: 7)
// possiblePlanet is of type Planet? and equals Planet.uranus

可是,并不是装有的原始值都能找到相配的枚举值,所以原始值早先化器(可难倒的初始化器)总是回到枚举的可选类型,可整合可选绑定和switch说话处理该可选类型。

let positionToFind = 11
if let somePlanet = Planet(rawValue: positionToFind) {
    switch somePlanet {
    case .earth:
        print("Mostly harmless")
    default:
        print("Not a safe place for humans")
    }
} else {
    print("There isn't a planet at position \(positionToFind)")
}
// Prints "There isn't a planet at position 11"

<br />

enum Planet {
    case mercury, venus, earth, mars, jupiter, saturn, uranus, neptune
}

递归枚举

递归枚举是负有另二个枚举作为枚举成员关联值的枚举。在注明枚举成员此前运用indirect根本字来家喻户晓它是递归的。

enum ArithmeticExpression {
    case number(Int)
    indirect case addition(ArithmeticExpression, ArithmeticExpression)
    indirect case multiplication(ArithmeticExpression, ArithmeticExpression)
}

能够在枚举从前写==indirect==来让整个枚举成员在须求时得以递归:

indirect enum ArithmeticExpression {
    case number(Int)
    case addition(ArithmeticExpression, ArithmeticExpression)
    case multiplication(ArithmeticExpression, ArithmeticExpression)
}

let five = ArithmeticExpression.number(5)
let four = ArithmeticExpression.number(4)
let sum = ArithmeticExpression.addition(five, four)
let product = ArithmeticExpression.multiplication(sum, ArithmeticExpression.number(2))

func evaluate(_ expression: ArithmeticExpression) -> Int {
    switch expression {
    case let .number(value):
        return value
    case let .addition(left, right):
        return evaluate(left) + evaluate(right)
    case let .multiplication(left, right):
        return evaluate(left) * evaluate(right)
    }
}

print(evaluate(product))
// Prints "18"

递归枚举

当有些枚举值的关联值类型是该枚举类型时,该枚举是递归枚举。

递归枚举有二种书写格局:

  1. 在急需递归的枚举值前增加indirect根本字,给部分枚举值启用递归。

`

enum ArithmeticExpression {
    case number(Int)
    indirect case addition(ArithmeticExpression, ArithmeticExpression)
    indirect case multiplication(ArithmeticExpression, ArithmeticExpression)
}

二.在注明枚举类型enum注重字前加上indirect最首要字,给具有枚举值启用递归。

indirect enum ArithmeticExpression {
    case number(Int)
    case addition(ArithmeticExpression, ArithmeticExpression)
    case multiplication(ArithmeticExpression, ArithmeticExpression)
}

开创上述递归枚举实例:

let five = ArithmeticExpression.number(5)
let four = ArithmeticExpression.number(4)
let sum = ArithmeticExpression.addition(five, four)
let product = ArithmeticExpression.multiplication(sum, ArithmeticExpression.number(2))

将递归枚举封装成递归函数:

func evaluate(_ expression: ArithmeticExpression) -> Int {
    switch expression {
    case let .number(value):
        return value
    case let .addition(left, right):
        return evaluate(left) + evaluate(right)
    case let .multiplication(left, right):
        return evaluate(left) * evaluate(right)
    }
}

print(evaluate(product))
// Prints "18"

递归枚举

当某些枚举值的关联值类型是该枚举类型时,该枚举是递归枚举。

递归枚举有三种书写方式:

  1. 在急需递归的枚举值前增进indirect重中之重字,给一些枚举值启用递归。

`

enum ArithmeticExpression {
    case number(Int)
    indirect case addition(ArithmeticExpression, ArithmeticExpression)
    indirect case multiplication(ArithmeticExpression, ArithmeticExpression)
}

2.在申明枚举类型enum第一字前加上indirect要害字,给持有枚举值启用递归。

indirect enum ArithmeticExpression {
    case number(Int)
    case addition(ArithmeticExpression, ArithmeticExpression)
    case multiplication(ArithmeticExpression, ArithmeticExpression)
}

始建上述递归枚举实例:

let five = ArithmeticExpression.number(5)
let four = ArithmeticExpression.number(4)
let sum = ArithmeticExpression.addition(five, four)
let product = ArithmeticExpression.multiplication(sum, ArithmeticExpression.number(2))

将递归枚举封装成递归函数:

func evaluate(_ expression: ArithmeticExpression) -> Int {
    switch expression {
    case let .number(value):
        return value
    case let .addition(left, right):
        return evaluate(left) + evaluate(right)
    case let .multiplication(left, right):
        return evaluate(left) * evaluate(right)
    }
}

print(evaluate(product))
// Prints "18"

各类枚举定义了一个簇新的门类。像 Swift中别的品种一样,它们的名字(例如CompassPoint和Planet)应该以三个大写字母起初。给枚举类型起1个单数名字而不是复数名字,以便于读起来更为便于驾驭:

var directionToHead = CompassPoint.west

directionToHead的项目能够在它被CompassPoint的有些值先河化时估量出来。壹旦directionToHead被声称为CompassPoint类型,你能够行使更简短的点语法将其安装为另3个CompassPoint的值:

directionToHead = .east

当directionToHead的项目已知时,再度为其赋值可以省略枚举类型名。在行使全数显式类型的枚举值时,那种写法让代码具备越来越好的可读性。

利用 Switch 语句相配枚举值

directionToHead = .south
switch directionToHead {
case .north:
print("Lots of planets have a north")
case .south:
print("Watch out for penguins")
case .east:
print("Where the sun rises")
case .west:
print("Where the skies are blue")
}
// 打印 "Watch out for penguins”

在认清一个枚举类型的值时,switch语句必须穷举全部情状。要是忽略了.west那种情景,上边那段代码将不恐怕通过编写翻译,因为它从不思索到CompassPoint的整套分子。强制穷举确定保障了枚举成员不会被意外遗漏。如若不需求方方面面列举,能够用default关键字去处理没周朝举完的景观

关联值

偶然能够把任何品种的关联值和成员值一同存款和储蓄起来会很有用。那能让您连同成员值一同存款和储蓄额外的自定义音信,并且你每便在代码中采纳该枚举成员时,还足以修改这么些涉及值。

您能够定义 Swift枚举来储存任意档次的关系值,若是必要的话,每种枚举成员的关联值类型能够各差别。枚举的那种特征跟别的语言中的可识别联合(discriminated
unions),标签联合(tagged unions),或许变体(variants)相似。

enum Barcode {
    case upc(Int, Int, Int, Int)
    case qrCode(String)
}
var productBarcode = Barcode.upc(8, 85909, 51226, 3)
productBarcode = .qrCode("ABCDEFGHIJKLMNOP")
switch productBarcode {
case .upc(let numberSystem, let manufacturer, let product, let check):
    print("UPC: \(numberSystem), \(manufacturer), \(product), \(check).")
case .qrCode(let productCode):
    print("QR code: \(productCode).")
}
// 打印 "QR code: ABCDEFGHIJKLMNOP."

你能够在switch的 case
分支代码中领到每一种关联值作为一个常量(用let前缀)或然当作三个变量(用var前缀)来利用

要是三个枚举成员的全体关联值都被提取为常量,也许都被提取为变量,为了简洁,你能够只在成员名称前标注八个let或许var:

switch productBarcode {
case let .upc(numberSystem, manufacturer, product, check):
    print("UPC: \(numberSystem), \(manufacturer), \(product), \(check).")
case let .qrCode(productCode):
  print("QR code: \(productCode).")
}
// 输出 "QR code: ABCDEFGHIJKLMNOP."

原始值

用作关联值的代替选取,枚举成员能够被默许值(称为原始值)预填充,那一个原始值的体系必须一致。原始值能够是字符串,字符,大概随便整型值或浮点型值。各个原始值在枚举注脚中务必是绝无仅有的。

enum ASCIIControlCharacter: Character {
    case tab = "\t"
    case lineFeed = "\n"
    case carriageReturn = "\r"
}

注意
原始值和关联值是分裂的。原始值是在定义枚举时被先行填充的值,像上述四个ASCII
码。对于2个特定的枚举成员,它的原始值始终不改变。关联值是创办八个基于枚举成员的常量或变量时才设置的值,枚举成员的关联值能够生成。

原始值的隐式赋值

在采用原始值为整数也许字符串类型的枚举时,不供给显式地为每四个枚举成员设置原始值,Swift将会自行为你赋值。

例如,当使用整数作为原始值时,隐式赋值的值依次递增一。倘若第三个枚举成员未有安装原始值,其原始值将为0。

上边包车型地铁枚举是对在此之前Planet那么些枚举的三个细化,利用整型的原始值来代表每一种行星在太阳系中的顺序:

enum Planet: Int {
    case mercury = 1, venus, earth, mars, jupiter, saturn, uranus, neptune
}

在地点的例证中,Plant.mercury的显式原始值为壹,Planet.venus的隐式原始值为二,依次类推。

当使用字符串作为枚举类型的原始值时,各个枚举成员的隐式原始值为该枚举成员的称谓。

上边包车型地铁事例是CompassPoint枚举的细化,使用字符串类型的原始值来代表种种方向的称谓:

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

动用枚举成员的rawValue属性能够访问该枚举成员的原始值:

let earthsOrder = Planet.earth.rawValue
// earthsOrder 值为 3

let sunsetDirection = CompassPoint.west.rawValue
// sunsetDirection 值为 "west"

应用原始值初步化枚举实例

借使在定义枚举类型的时候利用了原始值,那么将会自动获得3个伊始化方法,这么些法子接收3个叫作rawValue的参数,参数类型即为原始值类型,再次回到值则是枚举成员或nil。你能够采纳这几个伊始化方法来成立叁个新的枚举实例。若是未有对号入座的原始值,则赶回nil

递归枚举

递归枚举是一种枚举类型,它有一个或多少个枚举成员选取该枚举类型的实例作为关系值。使用递归枚举时,编译器会插入三个直接层。你能够在枚举成员前增进indirect来表示该成员可递归。

比如说,上边的例证中,枚举类型存款和储蓄了简要的算术表明式:

enum ArithmeticExpression {
    case number(Int)
    indirect case addition(ArithmeticExpression, ArithmeticExpression)
    indirect case multiplication(ArithmeticExpression, ArithmeticExpression)
}

您也得以在枚举类型发轫加上indirect关键字来表明它的有着成员都是可递归的:

indirect enum ArithmeticExpression {
  case number(Int)
  case addition(ArithmeticExpression, ArithmeticExpression)
  case multiplication(ArithmeticExpression, ArithmeticExpression)
}
func evaluate(_ expression: ArithmeticExpression) -> Int {
    switch expression {
    case let .number(value):
        return value
    case let .addition(left, right):
        return evaluate(left) + evaluate(right)
    case let .multiplication(left, right):
        return evaluate(left) * evaluate(right)
    }
}
let five = ArithmeticExpression.number(5)
let four = ArithmeticExpression.number(4)
let sum = ArithmeticExpression.addition(five, four)
let product = ArithmeticExpression.multiplication(sum, ArithmeticExpression.number(2))
print(evaluate(product)) //  print 18

自作者归纳的掌握是可递归:假诺是可递归,关联值类型能够是该枚举本身

发表评论

电子邮件地址不会被公开。 必填项已用*标注

网站地图xml地图
Copyright @ 2010-2019 美高梅手机版4858 版权所有