Swift-->枚举

心情有没有好一点

在介绍枚举之前我们先了解一下Swift中 关于面向对象的类型

Swift中不仅提供了 面向过程的编程支持,也提供了全面的面向对象的支持,与普通的面向对象的编程语言(只支持类)不同,Swift可以定义枚举,结构体,类 3种面向对象的类型(或swift类型)、这三种类型,都可以被认为是一种该自定义的数据类型,可以被枚举,结构体,类来定义变量,其中 枚举结构体值类型,使用定义的变量则是引用类型

实例和对象的关系
在Swift中,实例和对象是不同的, 只有类的实例 才能成为对象,而结构体和枚举实例则只能称为 实例,不能成为对象

在这三种程序单元的内部,分别可以定义属性(存储属性,计算属性)、方法、构造器、下标、嵌套类型(包括嵌套类、嵌套结构体、嵌套枚举)5中类型成员

现在进入正题

1、枚举的定义和特点

Swift中枚举:是一种重新定义的类型:和所有的语言的功能类似
作用:主要用于管理一组有限的值的集合
特点:
1.具有面向对象的特征
2.支持计算属性
3.支持实例方法和类型方法
4.允许枚举遵守指定协议来提供标准的功能
格式:
enum 枚举名 {
//使用case关键字列出所有的枚举值
//枚举的其他成员
}

//枚举的定义
    enum Season{
        case Spring 
        case  Summer 
        case  Fall
        case  Winter
    }
  • 上面枚举中定义了4个枚举值,每个枚举值使用一个case定义
  • 我们也可以使用一个case 定义多个枚举值
enum Weekly {
        //使用一个case列出多个枚举值
        case Monday,Tuesday,Wednesday,Thursday,Firday,Saturday,Sunday
    }

2、枚举的使用

与C、OC的枚举不同,Swift的枚举成员不会被分配一个默认的整数值,
【重点】也就是说,Swift的枚举名本身就代表一个枚举实例,对应一个枚举值,与整数值没有任何关系,
定义了Swift的任意类型之后,大致可从如下几个方面来使用该类型
1->声明变量
2->创建实例
3->访问类型属性
4->调用类型方法
5->派生子类。但Swift中 只有类才支持继承,枚举和结构体都不支持继承,因此枚举和结构体都不能派生子类
【注意】:这5中功能,是面向对象的总纲,以后无论学习任何面向对象的编程语言的时候,有了类之后,大致上都是使用上面列出的5种功能

         //1->声明
        var day:Weekly
        //2->创建实例
        //使用已有的枚举实例赋值(因为枚举名本身就代表一个枚举实例,所以不需要创建实例)
        day = Weekly.Firday
        print(day)

  • 在定义day的时候已经知道了day的类型 所以在后面使用的时候 可以省略 前面的类型
        day =  .Firday

3、枚举和Switch语句

【注】因为Switch语言中,Switch语句 必须是完备的,也就是说Switch语句的case必须覆盖所有可能的情况,否则最后必须添加default语句

let chooseDay = Weekly.Monday
 switch chooseDay {
        case  .Monday :
            print("1")
        case  .Tuesday:
            print("2")
        case  .Wednesday:
           print("3")
        case .Thursday :
            print("4")
        case .Firday:
            print("5")
        case .Saturday:
            print("6")
        case .Sunday:
            print("7")
       }

因为上面程序中的case已经覆盖了 所有枚举值,所以switch语句可以省略,default 分支,当然也可以添加上:只是会报个警告Default will never be executed
哦,对了 如果 你运行的时候,在switch chooseDay { 这行报警告Switch condition evaluates to a constant的话,可以把要声明的变量放到函数外

3、原始值

有点类似于,C、OC的枚举,通过原始值可以为每个枚举实例指定一个简单类型,如Int Double String等
语法:enum 枚举名 : 原始值类型 {
case 枚举值 = 原始值
}

  • 【注】 Swift并不要对每个枚举值都指定,原始值。
    Swift可以根据已指定的原始值,推断出它前后的所有枚举值
  • 原始值为:Int 类型
  enum weekDay2 :Int {
        case Monday=1,Tuesday,Wednesday=5,Thursday,Firday,Saturday,Sunday
    }
    //可以推断,Tuesday的原始值为2 Thursday=6  Firday=7
  • 原始值为:String类型

  • Swift也可以为 枚举值分配隐式的原始值--隐式的原始值与变量名同名

  • 这里程序只为Left 显式分配了原始值,意味着只有left的原始值是“Left” 其余的原始值 都是隐式原始值,也就是“Up”,"Down","Right"

【注】枚举要么完全不指定原始值,要么所有枚举都具有原始值,为了让所有的枚举都有原始值,即可让系统自动推断,也可指定显示指定

 enum  Orientation :String {
        case Up ,Down,Left="左",Right
    }

现在已经有了 原始值 ,接下来即可使用枚举提供的如下的构造器和属性
init?(rawValue:):可能失败的构造器:根据原始值返回对应的枚举值
hashValue:根据枚举值 获得原始值

 let  Orient = Orientation.Up
        print("\\(Orient.hashValue)")//通过枚举值-->原始值 
//输出Up 
  let MyOrient = Orientation(rawValue:"左") //原始值 --> 枚举值
        //因为init?(rawValue:)是一个 可能失败的构造器 所以要执行可选绑定
        if let newOrient = MyOrient {
            print(newOrient)
        }
//输出 Left 
        print("\\(Orient.hashValue)")//Orient.hashValue 获取哈希值
//输出 0 

4、 关联值

枚举除了可以定义一组,枚举成员之外,还可以为枚举成员定义一组关联值,--Swift并不要求各枚举 具有相同的关联值,关联值就是枚举实例携带的一些额外的数据,有点类似于枚举值的属性。
语法: 语法:case 枚举值(元组语法)

 enum Planet  {
        case Mercury (weight:Double ,density:Double,name:String)
        case Venus (Double ,Double)
        case Jupiter
    }
    //Mercury  Venus携带关联值,而且Mercury的关联值还指定了名称,虽然指定了名称但是,程序依然无法向访问元组成员一样访问关联值

    var p1 = Planet.Mercury(weight: 10, density: 10, name: "lpx")
  • 【注】:当程序为枚举值 指定了 关联值之后,程序使用这些枚举值的时,必须指定它的关联值。

** 关联值的访问**

  • 枚举中的关联值:需要声明额外的变量(常量),并将枚举的关联值绑定到这些变量或常量
        //【注】如果程序打算将某个枚举值的所有关联值都提取为变量或常量,也可只将一个var、let 放置在枚举成员的前面。
        //eg:   case let .Mercury(weight, density, last ):
        switch p1 {
            //这里就相当于 元组值的绑定
        case  Planet.Mercury(let weight , let density,let name ):
            print("weight= \\(weight) density=\\(density) name=\\(last)")
        default :
            print("")
        }
//输出 weight= 10.0 density=10.0 name=lpx

5、枚举的函数用法(【用的比较少】【而且没有提示】)

对于有关联值的枚举,甚至可以被当做函数使用,该函数总是可以根据关联值创建对应的枚举实例,与普通函数类似的是,可作为函数使用的枚举,也可以被赋值给函数类型的变量,

  let fn = Planet.Venus//将Planet.Venus赋给fn变量 得知fn是一个类型为(Double,Double)->Planet的函数
        let g1 = fn(10,10)//返回的就是关联值为 10,10的Venus的枚举值与直接获取的Planet.Venus(10, 10)的结果相同
        print(g1)
        
        let g2 = Planet.Venus(10, 10)
        print(g2)//这两个输出的一样的  Venus(10.0, 10.0)

6、递归枚举

在有些情况下,枚举值所包含的关联值类型 又是该枚举本身,此时就形成了递归枚举,

  enum Weekly2 {
    indirect   case Monday (next:Weekly2)
        case Tuesday (String)
        case  Wednesday
        case Thursday
        case  Firday
   indirect  case  Saturday(next:Weekly2)
        case Sunday
    }
  • Swift也支持用 indirect 修饰枚举本身,把indirect放到enum前面,这就相当于 在每个枚举值的case前都是用了indirect
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 212,454评论 6 493
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 90,553评论 3 385
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 157,921评论 0 348
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 56,648评论 1 284
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 65,770评论 6 386
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 49,950评论 1 291
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,090评论 3 410
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 37,817评论 0 268
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,275评论 1 303
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,592评论 2 327
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,724评论 1 341
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,409评论 4 333
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,052评论 3 316
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,815评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,043评论 1 266
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 46,503评论 2 361
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 43,627评论 2 350

推荐阅读更多精彩内容

  • 枚举为一组相关的值定义了一个共同的类型,使得可以在代码中以类型安全的方式来使用这些值。 如果熟悉 C 语言,会知道...
    穷人家的孩纸阅读 851评论 1 4
  • title: "Swift 中枚举高级用法及实践"date: 2015-11-20tags: [APPVENTUR...
    guoshengboy阅读 2,565评论 0 2
  • 枚举定义一组相关值的公共类型,并允许您在代码中以类型安全的方式使用这些值。 如果你熟悉C,你会知道C枚举分配相关的...
    Joker_King阅读 259评论 0 0
  • Swift 中枚举的特点: 不必给每一个枚举成员提供一个值。(枚举的 case 默认就是一个值) 枚举的值可以是 ...
    Laughingg阅读 621评论 0 0
  • 第四章 第二小节
    ALIVEANDDONE阅读 179评论 0 0