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内容的博客的。 

  • 相关阅读:
    hadoop中namenode发生故障的处理方法
    开启虚拟机所报的错误:VMware Workstation cannot connect to the virtual machine. Make sure you have rights to run the program, access all directories the program uses, and access all directories for temporary fil
    Hbase的安装与部署(集群版)
    分别用反射、编程接口的方式创建DataFrame
    用Mapreduce求共同好友
    SparkSteaming中直连与receiver两种方式的区别
    privot函数使用
    Ajax无刷新显示
    使用ScriptManager服务器控件前后台数据交互
    数据库知识
  • 原文地址:https://www.cnblogs.com/ludashi/p/4721158.html
Copyright © 2011-2022 走看看