(十四)swift 枚举语法

//使用 enum关键词来创建枚举并且把它们的整个定义放在一对大括号内:


enum SomeEnumeration {

    // 枚举定义放在这里

}



//下面是用枚举表示指南针四个方向的例子:


enum CompassPoint {

    case North

    case South

    case East

    case West

}


//枚举中定义的值( North , South , East West )是这个枚举的成员值(或成员)。你使用 case 关键字来 定义一个新的枚举成员值。


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



enum Planet {

    case Mercury, Venus, Earth, Mars, Jupiter, Saturn, Uranus, Neptune

}


//每个枚举定义了一个全新的类型。像 Swift中其他类型一样,它们的名字(例如 CompassPoint Planet )必须以一个大写字母开头。给枚举类型起一个单数名字而不是复数名字,以便于读起来更加容易理解:


var directionToHead = CompassPoint.West


//directionToHead 的类型可以在它被 CompassPoint的某个值初始化时推断出来。一旦 directionToHead被声明为

//CompassPoint 类型,你可以使用更短的点语法将其设置为另一个 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”



}



//当不需要匹配每个枚举成员的时候,你可以提供一个 default分支来涵盖所有未明确处理的枚举成员:


let somePlanet = Planet.Mars

switch somePlanet {

case .Earth:

    print("Mostly harmless")

default:

    print("Not a safe place for humans")

}

// 输出 "Mostly harmless”



enum Barcode {

    case UPCA(Int,Int, Int, Int)

    case QRCode(String)

}




//“定义一个名为 Barcode的枚举类型,它的一个成员值是具有 (Int,Int,Int,Int)类型关联值的 UPCA ,另一个成员值是具有 String类型关联值的 QRCode


//然后可以使用任意一种条形码类型创建新的条形码,例如:


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




//同一个商品可以被分配一个不同类型的条形码,例如:

productBarcode = .QRCode("ABCDEFGHIJKLMNOP")



switch productBarcode {

case .UPCA(let numberSystem,let manufacturer, let product, let check):

    print("UPC-A: \(numberSystem), \(manufacturer), \(product), \(check).")

case .QRCode(let productCode):

    print("QR code:\(productCode).")

}

// 输出 "QR code: ABCDEFGHIJKLMNOP."


switch productBarcode {

case let .UPCA(numberSystem, manufacturer, product, check):

    print("UPC-A: \(numberSystem), \(manufacturer), \(product), \(check).")

case let .QRCode(productCode):

    print("QR code:\(productCode).")

}

// 输出 "QR code: ABCDEFGHIJKLMNOP."




//原始值(Raw Values)


//这是一个使用 ASCII码作为原始值的枚举:


enum ASCIIControlCharacter: Character {

    case Tab = "\t"

    case LineFeed = "\n"

    case CarriageReturn = "\r"

}


//原始值的隐式赋值(Implicitly Assigned Raw Values)



//在使用原始值为整数或者字符串类型的枚举时,不需要显式地为每一个枚举成员设置原始值,Swift将会自动为 你赋值。

//例如,当使用整数作为原始值时,隐式赋值的值依次递增 1 。如果第一个枚举成员没有设置原始值,其原始值将0

//下面的枚举是对之前 Planet这个枚举的一个细化,利用整型的原始值来表示每个行星在太阳系中的顺序:

enum Planett: Int {

    case Mercury = 1, Venus, Earth, Mars, Jupiter, Saturn, Uranus, Neptune

}



//在上面的例子中, Plant.Mercury的显式原始值为 1 , Planet.Venus的隐式原始值为 2 ,依次类推。

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

//下面的例子是 CompassPoint枚举的细化,使用字符串类型的原始值来表示各个方向的名称:




enum CompassPointt: String {

    case North, South, East, West

}

//上面例子中, CompassPoint.South拥有隐式原始值 South ,依次类推。

//使用枚举成员的 rawValue属性可以访问该枚举成员的原始值:

let earthsOrder = Planett.Earth.rawValue// earthsOrder 值为 3


print(earthsOrder)


let sunsetDirection =CompassPointt.West.rawValue// sunsetDirection 值为 "West"


print(sunsetDirection)




//使用原始值初始化枚举实例(Initializing from a Raw Value)


//果在定义枚举类型的时候使用了原始值,那么将会自动获得一个初始化方法,这个方法接收一个叫做的参数,参数类型即为原始值类型,返回值则是枚举成员或。你可以使用这个初始化方法来创建一个新的枚 举实例。


//这个例子利用原始值7创建了枚举成员 :


let possiblePlanet = Planett(rawValue: 7)

// possiblePlanet 类型为 Planet?值为 Planet.Uranus


print(possiblePlanet)



//如果你试图寻找一个位置为 9的行星,通过原始值构造器返回的可选planet值将是nil :


let positionToFind = 9

if let somePlanet =Planett(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)")

}

// 输出 "There isn't a planet at position 9





//递归枚举(recursive enumeration)是一种枚举类型,它有一个或多个枚举成员使用该枚举类型的实例作为关联值。使用递归枚举时,编译器会插入一个间接层。你可以在枚举成员前加上 indirect来表示该成员可递归



//例如,下面的例子中,枚举类型存储了简单的算术表达式:



enum ArithmeticExpression {

    case Number(Int)

    indirectcase Addition(ArithmeticExpression,ArithmeticExpression)

    indirectcase Multiplication(ArithmeticExpression,ArithmeticExpression)

}



//你也可以在枚举类型开头加上 indirect关键字来表明它的所有成员都是可递归的:



indirect enum ArithmeticExpressions {

    case Number(Int)

    case Addition(ArithmeticExpression,ArithmeticExpression)

    case Multiplication(ArithmeticExpression,ArithmeticExpression)

}



//要操作具有递归性质的数据结构,使用递归函数是一种直截了当的方式。例如,下面是一个对算术表达式求值的函数:


func evaluate(expression: ArithmeticExpression) -> Int {

    switch expression {

    case .Number(let value):

        return value

    case .Addition(let left,let right):

        return evaluate(left) +evaluate(right)

    case .Multiplication(let left,let right):

        return evaluate(left) *evaluate(right)

    }

}

// 计算 (5 + 4) * 2

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))

// 输出 "18"


你可能感兴趣的:(enum,ios,函数,swift)