Swift2-0基础_Enumerations(枚举)


import Foundation
print("Hello, World!")

// 枚举为一组相关的值定义了一个共同的类型,使你可以在你的代码中以类型安全的方式来使用这些值

// 1 枚举语法
// 使用 enum 关键词来创建枚举并且把它们的整个定义放在一对大括号内
enum SomeEnumeration {
    // 枚举定义
    
}
// 枚举中定义的值(如 North , South , East 和 West )是这个枚举的成员值(或成员)。使用 case 关键字来定义一个新的枚举成员值。
enum CompassPoint {
    case North
    case South
    case East
    case West
}

/* 注意:     与 C 和 Objective-C 不同,Swift 的枚举成员在被创建时不会被赋予一个默认的整型值。     在上面的例子中, North , South , East 和 West 不会被隐式地赋值为 0 , 1 , 2 和 3     相反,这些枚举成员本身 就是完备的值,这些值的类型是已经明确定义好的 CompassPoint 类型     每个枚举定义了一个全新的类型。像 Swift 中其他类型一样,它们的名字(例如 CompassPoint 和 Planet )必 须 以 一 个 大 写 字 母 开 头     给枚举类型起一个单数名字而不是复数名字,以便于读起来更加容易理解: */

// 多个成员可以出现在同一行上,用“,”隔开
enum Name {
    case Kermit,Kangkang,Miss
}

var className = Name.Kangkang
// className的类型在初始化的时候可以被推断出为 Name 类型,可以使用更短的点语法将其设置成另一个值
className = .Kermit

// 2 使用Switch语句匹配枚举值
switch className {
case .Kangkang:
    print("Kangkang")
case .Kermit:
    print("Kermit")
default:
    print("Miss")
}

// 3 关联值
enum Person {
    case Name(String)
    case Birthday(String,String)
}

var name = Person.Name("Kermit")
var birthday = Person.Birthday("01", "01")

switch birthday {
case .Name(let name):
    print(name)
case .Birthday(let month,let day):
    print("\(month)月\(day)日")
}

// 4 原始值 每个原始值在枚举声明中必须是唯一的
/* 注意 原始值和关联值是不同的。原始值是在定义枚举时被预先填充的值,像上述三个 ASCII 码。 对于一个特定的枚举成员,它的原始值始终不变。关联值是创建一个基于枚举成员的常量或变量时才设置的值,枚举成员的关联值可以变化。 */
enum ASCIIControlCharacter:Character {
    case Tab = "\t"
    case LineFeed = "\n"
    case CarriageReturn = "\r"
}
// 原始值得隐式赋值
enum Num:Int {
    case one = 1,two,three,four
}
print(Num.four.rawValue,Num.one.hashValue)

// 使用原始值初始化枚举实例 (原始值构造器是一个可失败构造器,因为并不是每一个原始值都有与之对应的枚举成员)
let newThreeNum = Num(rawValue: 3)
print(newThreeNum)  // Optional(Enumerations.Num.three)

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

enum ArithmeticExpression {
    case Number(Int)
    indirect case Addtion(ArithmeticExpression, ArithmeticExpression)
    indirect case Multiplication(ArithmeticExpression, ArithmeticExpression)
}
// 在枚举类型开头加上indirect表示所有成员都是可递归的
indirect enum ArithmeticExpression2 {
    case Number2(Int)
    case Addtion2(ArithmeticExpression2, ArithmeticExpression2)
    case Multiplication2(ArithmeticExpression2, ArithmeticExpression2)
}

func evaluate(expression:ArithmeticExpression) -> Int {
    switch expression {
    case .Number(let value):
        return value
    case .Addtion(let leftNum, let rightNum):
        return evaluate(leftNum) + evaluate(rightNum)
    case .Multiplication(let leftNum, let rightNum):
        return evaluate(leftNum) * evaluate(rightNum)
    }
}
let five = ArithmeticExpression.Number(5)
let four = ArithmeticExpression.Number(4)
let sum = ArithmeticExpression.Addtion(five, four)
let product = ArithmeticExpression.Multiplication(sum, ArithmeticExpression.Number(2))
print(evaluate(product))    // 18

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