zoukankan      html  css  js  c++  java
  • 窥探Swift之别样的枚举类型

      想必写过程序的童鞋对枚举类型并不陌生吧,使用枚举类型的好处是多多的,在这儿就不做过多的赘述了。Fundation框架和UIKit中的枚举更是数不胜数,枚举可以使你的代码更易阅读并且可以提高可维护性。在Swift语言中的枚举可谓是让人眼前一亮。在Swift中的枚举不仅保留了大部分编程语言中枚举的特性,同时还添加了一些好用而且实用的新特性,在本篇博客中将领略一些Swift中枚举类型的魅力。

      有小伙伴会问,不就是枚举么,有什么好说的。在Swift中的枚举怎不然,Swift中的枚举的功能要强大的多,不仅可以给枚举元素绑定值,而且可以给枚举元素关联多个值,同时还可以通过元素的值给一个枚举变量赋一个枚举值,并且枚举中可以定义枚举函数。下面将要开始窥探一下Swift中的枚举。

      一、定义枚举

        在Swift中枚举的定义与其他编程语言中定义枚举不同,在每个枚举元素前面多了一个关键字case,  case后紧跟的是枚举元素,下面是定义枚举类型的两种方式。

        1. 多个case, 每个枚举元素前都有个case

    1 //枚举的定义
    2 enum KindOfAnimal {
    3     case Cat
    4     case Dog
    5     case Cow
    6     case Duck
    7     case Sheep
    8 }

        2.一个case搞定所有元素,枚举元素之间使用逗号隔开

    1 //你也可以这样定义枚举类型
    2 enum KindOfAnimalTwo {
    3     case Cat, Dog, Cow, Duck, Sheep
    4 }

      二、枚举类型的使用

        定义完枚举类型就是为了使用的对吧,直接使用枚举类型声明变量即可, 在Swift中是不需要typedef来定义枚举类型的,我们可以直接使用枚举类型。

    //定义枚举变量并赋值
    var animal1: KindOfAnimal = KindOfAnimal.Cat

        给枚举变量赋值时也可以把枚举类型名省略掉,因为在声明枚举变量时就已经指定了枚举变量的类型。

    var animal2: KindOfAnimal = .Dog

        在Switch中使用我们的枚举变量

     1 //在Switch…Case中使用枚举
     2 switch animal1  {
     3     case KindOfAnimal.Cat:
     4         println("Cat")
     5     case KindOfAnimal.Dog:
     6         println("Dog")
     7     case KindOfAnimal.Cow:
     8         println("Cow")
     9     case KindOfAnimal.Duck:
    10         println("Duck")
    11     case KindOfAnimal.Sheep:
    12         println("Sheep")
    13     default:
    14         println("error = 呵呵")
    15 }

      三、给枚举成员赋值

        在Swift中声明枚举时,是可以给每个枚举成员赋一个值的,下面的City枚举的成员就被指定了一个值,如下所示:

    //给枚举赋值
    enum City: String{
        case Beijing = "北京"
        case ShangHai = "上海"
        case GuangZhou = "广州"
        case ShengZhen = "深圳"
    }

        使用枚举变量的rawValue可以获取给每个枚举成员赋的值,代码如下:

    //定义枚举变量并赋值
    var myInCity: City = City.Beijing
    
    //获取枚举变量的值
    var myInCityString: String = myInCity.rawValue;
    println(myInCityString)    //输出:北京

      四、通过枚举成员的值给枚举变量赋值

        什么是通过枚举成员的值给枚举变量赋值呢?举个例子,以上面的枚举类型City为例,假如我们只知道一个枚举成员的值是“北京”,而不知道“北京”这个值对应的枚举成员是"Beijing", 在Swift中是可以通过“北京”这个值给枚举变量赋一个枚举成员“Beijing”的。

        是不是有点绕啊,来点实例吧,下面就是通过枚举成员的原始值给枚举变量赋值的代码

    //通过枚举成员的值,来给枚举成员赋值
    var youInCity: City? = City(rawValue: "北京");

        为啥我们的youInCity是可选值类型的呢?原因很简单,我们不确定枚举City中的成员的值是否含有“北京”,枚举变量youInCity的值是不确定的,所以喽是可选类型的,下面我们就取出youInCity的值,首先判断youInCity是否为City.Beijing, 如果是,说明赋值成功就输出值。

    //取出youInCity中的值
    if youInCity == City.Beijing {
        var cityName: NSString = youInCity!.rawValue
        println(cityName) //输出:北京
    }

        找一个枚举成员的值中不包含的字符串用来给枚举变量赋值,观察一下结果,下面的testCity的值打印出来为nil, 因为枚举中没有一个成员的值为“京”。

    //传入一个枚举中没有的值
    var testCity: City? = City(rawValue: "");
    
    // testCity为nil
    println(testCity)

      五、枚举值自增

        好东西还是要保留的,在Swift中的枚举值如果是整数的话,第一个赋值后,后边的会自增的。关于枚举值自增就不多说了,直接看实例吧。

    //枚举值自增
    enum Hour: Int{
        case One = 1
        case Two
        case Three
        case Four
        case Five
        case Six
        case Seven
        case Eight
    }
    
    var hourTest: Int = Hour.Eight.rawValue
    println(hourTest)      // hourTest = 8

      六、枚举关联值

        什么是枚举的关联值呢?从字面意思上看是给枚举成员关联一个值,没错,就是在给枚举变量赋值时,给枚举变量关联一个值。在Swift中如何做的呢?就是在声明枚举类型中的元素时使用小括号来制定关联值的类型,然后在给枚举变量赋值的时候关联一个或者多个值即可,直接看实例。

        下面的代码是给iOS指定了两个String类型的关联值,在给枚举变量赋值的时候关联两个值。关联这两个值可以在Switch语句中进行使用。

    //枚举的关联值
    enum mobileLanguage{
        case IOS (String, String)
        case Android (String)
    }
    
    var iPhone: mobileLanguage = mobileLanguage.IOS("Objective-C", "Swift")
    
    switch iPhone {
        case  mobileLanguage.IOS(let language1, let language2):
            println("language1 = (language1), language2 = (language2)")
        
        case mobileLanguage.Android(let temp):
            println(temp);
        default:
            println("NO")
    }
    
    //输出结果:language1 = Objective-C, language2 = Swift

      七、枚举函数

        在Swift中的枚举是可以添加函数的,有没有眼前一亮呢。下面的代码段是在上面的关联值代码的基础上添加了一个描述函数,返回的就是当前枚举变量的枚举信息,如下代码段所示:

     1 //枚举函数
     2 enum mobileLanguageFun{
     3     case IOS (String, String)
     4     case Android (String)
     5     //定义枚举函数
     6     var description: String{
     7         switch self {
     8             case  mobileLanguageFun.IOS(let language1, let language2):
     9                 return "language1 = (language1), language2 = (language2)"
    10                 
    11             case mobileLanguageFun.Android(let temp):
    12                 return temp
    13             default:
    14                 return ("NO")
    15         }
    16 
    17     }
    18 }
    19 
    20 var myMobile: mobileLanguageFun = mobileLanguageFun.IOS("objc", "swift")
    21 
    22 println(myMobile.description)  //language1 = objc, language2 = swift

      

      今天的博客内容也够长了,就先到这儿吧,以后会继续更新关于Swift内容的博客的。 

  • 相关阅读:
    一步步学习微软InfoPath2010和SP2010--第十三章节--SharePoint视图和仪表板(7)--XSLT列表视图web部件
    一步步学习微软InfoPath2010和SP2010--第十三章节--SharePoint视图和仪表板(6)--筛选器web部件
    一步步学习微软InfoPath2010和SP2010--第十三章节--SharePoint视图和仪表板(5)--库web部件
    一步步学习微软InfoPath2010和SP2010--第十三章节--SharePoint视图和仪表板(4)--基于视图的通知
    一步步学习微软InfoPath2010和SP2010--第十三章节--SharePoint视图和仪表板(3)--等级
    一步步学习微软InfoPath2010和SP2010--第十三章节--SharePoint视图和仪表板(2)--视图
    思考架构演进的主要驱动因素是什么?
    软件设计的一点理解
    从接触的代码进行源码阅读
    设计一个存储方案的存储结构的细节问题,需要考虑以下因素:
  • 原文地址:https://www.cnblogs.com/ludashi/p/4721158.html
Copyright © 2011-2022 走看看