zoukankan      html  css  js  c++  java
  • 学习Swift--枚举的初步认识 --个人备忘 大神勿喷

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

    // 定义枚举的语法
    enum Chips {    // 定义了薯片的枚举,包含了3种口味的成员
        case Tomato
        case Original
        case Barbecue
    }
    

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

    一般匹配枚举值都是用switch

    var chip = Chips.Original
    // 匹配枚举值
    switch chip {
    case .Tomato :
        print("tomato")
    case .Original :
        print("original")
    case .Barbecue :
        print("barbecue")
    }
    

    上面的例子演示了枚举的基本语法,下面来记录一下为成员值赋予一个任何属性的相关值,一起储存起来的话一些特别情况会更便利些

    // <假如>自定义了一个控件需要传控件的显示形式(如button的custom)
    enum ViewType {
        case Normal(String)             // 比如说需要传进一个要显示的字符串
        case Contains(Double, Double)   // 比如说需要传进显示比例
    }
    
    var viewType = ViewType.Normal("传入了需要显示的字符串(赋予了相关值)")
    
    switch viewType {
    case .Normal(var str) :
        print("设置控件需要显示的字符串");
    case let .Contains(widthScale, hightScale) :
        print("设置控件的宽高缩放比例");
    }
    

    作为相关值的另一种选择,枚举成员可以被默认值(称为原始值)赋值,其中这些原始值具有相同的类型。

    enum Month : Int {      // 因为原始值类型必须一致 所以将原始值定义为Int  注意:原始值和相关值不能同时使用
        case January        // 如果没有给定原始值 会隐式将第一个成员赋值为0,随后的每一个成员递增1
        case February
        case March
        case April
    }
    
    var february = Month.February
    print(february, february.rawValue)  // 输出:"February 1
    "
    
    enum Month : Int {      // 也可以将所有成员值缩减到1行 与之前的效果是一样的
        case January = 1, February, March, April
    }
    
    var february = Month.February
    print(february, february.rawValue)  // 输出:"February 2
    "
    

     注:如果初始值为Float或Double的话也会默认递增1

    enum Month : String {      // 如果是字符串类型的初始值、并且没有显式的赋值,那么就将成员名字设置为初始值
        case January = "1月", February, March, April
    }
    
    var january = Month.January
    print(january, january.rawValue)    // 输出:"January 1月
    "
    
    var march = Month.March
    print(march, march.rawValue)        // 输出:"March March
    "
    

    下面来记一下通过原始值来构造枚举

    enum ViewContentType : Int {        // 模拟一个视图的内容模式
        case Normal = 0, System, Custom, Ancient
    }
    
    // 根据原始值构造一个枚举
    if let type = ViewContentType(rawValue: 2){     // 注意 原始值构造器是可失败构造器(可能会返回nil)所以返回的是可选类型,需要使用可选绑定
        switch type {
        case .Normal:
            // do something...
            print(type)
        case .System:
            // do something...
            print(type)
        default:
            // do sonthing...
            print(type)             // 最后输出这一句
        }
    }
    

    下面来记录下相比较OC中的枚举 Swift枚举的新特性:Swift中 枚举可以定义类型属性和实例属性

    // <假如>自定义了一个控件需要传控件的显示形式(如button的custom)
    enum ViewType {
        
        // 我们拿这个枚举举例 假如说声明一个实例属性可以返回相对应成员值的size 注意 viewSize是只读的计算属性
        var viewSize : CGSize {
            switch self {
            // 参数暂时省略
                // 可以根据不同的成员返回相对应的size
            case .Normal(_) :               return CGSize( 100, height: 20)
            case .Contains(_, _) :          return CGSize( 390, height: 300)
            }
        }
        
        // 声明类型属性
        static let comment = "这个枚举有两个成员,设置不同的值来改变控件的摆布状态"
        
        case Normal(String)             // 比如说需要传进一个要显示的字符串
        case Contains(Double, Double)   // 比如说需要传进显示比例
    }
    
    
    let type = ViewType.Normal("一个字符串")
    // 调用实例计算属性 获得size
    let viewSize = type.viewSize
    
    // 调用类型计算属性
    print(ViewType.comment)
    

    枚举还可以声明方法

    enum Month : Int {      // 因为原始值类型必须一致 所以将原始值定义为Int  注意:原始值和相关值不能同时使用
        
        // 枚举可以声明方法 就跟类的写法一样 不过要是修改自身的值就需要加一个关键字
        mutating func nextMonth() -> String {
            switch self {
            case January :
                self = February
                return "已经到2月拉"
            
                
            case .February :
                self = March
                return "已经到3月拉"
                
            
            default : return "以此类推"
            }
        }
        
        case January        // 如果没有给定原始值 会隐式将第一个成员赋值为0,随后的每一个成员递增1
        case February
        case March
        case April
    }
    
    var month = Month(rawValue: 0)          // january
    let string = month?.nextMonth()         // 返回一个字符串 并且把成员值改为February
    print(month)                            // 打印出 "Optional(Month.February)
    "
    
  • 相关阅读:
    P2280 [HNOI2003]激光炸弹[前缀和]
    P1280 尼克的任务[区间覆盖dp]
    P1352 没有上司的舞会[树形dp]
    HDU1024 Max Sum Plus Plus[DP]
    P1282 多米诺骨牌[可行性01背包]
    P1063 能量项链[区间DP]
    P1880 [NOI1995]石子合并[环形DP]
    P1091 合唱队形[单调性+DP]
    Gym 100971D 单调栈
    Gym 100971A Treasure Island BFS 思维题
  • 原文地址:https://www.cnblogs.com/Alex-sk/p/5157248.html
Copyright © 2011-2022 走看看