美文网首页Swift
Swift 3.0之八、枚举

Swift 3.0之八、枚举

作者: 麟young | 来源:发表于2016-12-28 11:10 被阅读7次

    1. 定义

    一组相关值的通用类型。

    2. 语法

    enum 枚举名称 {
        case caseName1
        case caseName2
        ...
    }
    

    举个栗子:

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

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

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

    访问枚举中的case:

    var directionToHead = CompassPoint.west
    

    上面directionToHead将被推断为CompassPoint类型,再次访问CompassPoint中的case时可以省略CompassPoint,即:

    directionToHead = .east
    

    3. 枚举和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"
    

    如果不能为所有枚举成员都提供一个case,使用default来包含那些不能被明确写出的情况:

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

    4. 关联值

    枚举中的case可以存放关联不同基本类型的值,如:

    // 定义一个叫做 Barcode的枚举类型
    // 它要么用 (Int, Int, Int, Int)类型的关联值获取 upc 值
    // 要么用 String 类型的关联值获取一个 qrCode的值。
    
    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).")
    }
    // 结果为: "QR code: ABCDEFGHIJKLMNOP."
    

    上面的栗子也可以把括号内的let放到前面,简写为:

    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."
    

    5. 原始值

    为case中的变量提供默认值,也叫原始值。如:

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

    隐式指定的原始值

    默认情况下,整型的枚举,case的原始值从0开始依次递增+1;字符串类型的枚举,原始值就是case名称对应的字符串。

    如果为整型枚举提供第一个case的原始值,则后面的case原始值依次+1,即Planet.venus = 2,Planet.earth = 3 ...... :

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

    再举个String类型的枚举的栗子,其原始值就是case后的名称对应的字符串:

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

    访问原始值:

    
    let earthsOrder = Planet.Earth.rawValue
    // earthsOrder 的值为 3
     
    let sunsetDirection = CompassPoint.west.rawValue
    // sunsetDirection 的值为 "west"
    

    用原始值初始化

    举个栗子:

    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"
    

    注意: 用原始值初始化枚举的方法,返回的是可选类型,因此用if+ 赋值语句进行判断。

    相关文章

      网友评论

        本文标题:Swift 3.0之八、枚举

        本文链接:https://www.haomeiwen.com/subject/salyvttx.html