Swift Enum与Switch

枚举:

其实大家都耳熟能详了,多种语言都有,可能大家使用的频率不一样罢了.

简介:

枚举为一系列相关联的值定义一个公共的数据类型,同时能够让你在编程的时候在类型安全的情况下去使用这些值.

比如:周,月份等等

Switch 就更不用说了,只不过,Swift的Switch太强大了,强大到你惊讶.嘻嘻...

史上最强大的Switch来袭

请看Code+注释:

//
//  ViewController.swift
//  enum with switch
//
//  Created by NapoleonBai on 14-11-17.
//  Copyright (c) 2014年 NapoleonBai. All rights reserved.
//

import UIKit

/**
定义枚举<枚举的定义:关键字:enum>
*/
enum DAYOFWEEK{
    //从周一到周日
    case MONDAY
    case TUESDAY
    case WEDNESDAY
    case THURSDAY
    case FRIDAY
    case SATURDAY
    case SUNDAY
    //采用关键字case来标记定义了一个新的枚举成员变量(或者说是成员)
    /*
    注意:与C或者Objective-C不同的是,在Swift语言中枚举类型的成员初始的时候不会被默认赋值成整数值,在这里,MONDEY,...SUNDAY默认不会隐式的等于0,1,2... 6。取而代之的是不同的枚举成员将要用什么类型以及赋值什么值都是可以自己控制的,可以在定义DAYOFWEEK这个枚举的时候指定.
    */
    
    //当然了,也许你会问,那么可以只写一个case不?答案是允许的
    //eg:
    /*
    case MONDAY,TUESDAY,WEDNESDAY,THURSDAY,FRIDAY,SATURDAY,SUNDAY
    //这样的写法跟上面一样,这样写就节省了case,只需用,号隔开就行
    */
    
    //至于在初始化指定值,那么就是这样的
    //eg:
    /*
    enum DAYOFWEEK : Int{ case MONDAY = 0 ...}
    注意:只有当类型为整型的时,才会自增长,其他类型不会
    */
}

//枚举的其他类型
enum OtherEnum{
    //采用元组进行定义
    case ERRORCODE(Int,String)
    case ERRORTYPE(String)
}


class ViewController: UIViewController {

    override func viewDidLoad() {
        super.viewDidLoad()
        // Do any additional setup after loading the view, typically from a nib.
        //调用:传入sunday
        self.managerEnum(DAYOFWEEK.SUNDAY)
        
        //传入Wednesday
        self.managerEnum(DAYOFWEEK.WEDNESDAY)
        
        //上述调用输出:
        //今天:星期日
        //今天:星期三
        
        
        self.managerEnumOther(OtherEnum.ERRORCODE(404, "NOT FOUND"))
        //error code = 404 ,message = NOT FOUND
        
        self.managerEnumOther(OtherEnum.ERRORTYPE("路径未找到"))
        //errortype = 路径未找到
    }


    
    //此函数用来管理枚举
    func managerEnum(mdayOfWeek : DAYOFWEEK){
        //上面定义了一个枚举,是定义的周一到周末七个变量,这里我们将使用一下试试效果
        /*
        说明:
        如果采用switch来进行枚举选择输出,那么就需要把枚举中得所有成员变量都要考虑到,否则编译不通过
        因为mdayOfWeek是DAYOFWEEK类型,所以可以直接使用.SUNDAY进行输出
        */
        //eg:
        
        //用来确定是周几
        var todayOfWeek = "星期日";
        
        switch mdayOfWeek{
        case .SUNDAY:
            todayOfWeek = "星期日"
        case .MONDAY:
            todayOfWeek = "星期一"
        case .TUESDAY:
            todayOfWeek = "星期二"
        case .WEDNESDAY:
            todayOfWeek = "星期三"
            break
        case .THURSDAY:
            todayOfWeek = "星期四"
            break
        case .FRIDAY:
            todayOfWeek = "星期五"
            break
        case DAYOFWEEK.SATURDAY:
            todayOfWeek = "星期六"
            break
        default:
            
            break
        }
        
        println("今天:\(todayOfWeek)")
        /*
        此处应该说点什么:
        switch吧,在Swift中Switch得到了增强,可以看到,上面的case语句中,有得并没有增加break,
        是不是习惯性地回想:这样是不是会执行完一个,继续执行下一个呢?直到遇到break再跳出.
        
        答案是:swift中,编译器在case中自动增加了break语句,每次一个case执行完毕,就自动break,所一个,加不加break都是一样的
        那么,如果有需求是需要执行两个或更多呢?那又怎么办?
        那我们看下面:
        */
        
        //eg:
        
        managerSwitch(2)
        //输出:
        /*
        这是2
        这是3
        这是4
        */
        
        managerSwitch(4)    //这是4
        
        //这样就很容易的看出来,如果想要继续执行下一个case语句,那么就需要fallthrough的帮忙了,一定要记得呀
        //嘻嘻
        
        //那么,如果有需求是这样滴:
        //周一到周三公司上班,周四,周五出差,周六,周日休息,那么怎么做了,
        //是不是会想到上面的那个方法?其实,swif提供了一个更加爽朗的方式,请看
        //eg:
        
        managerSwitchTwo(DAYOFWEEK.FRIDAY)
        
        managerSwitchTwo(DAYOFWEEK.THURSDAY)
        
        managerSwitchTwo(DAYOFWEEK.TUESDAY)
        /*
        依次打印:
        出差啦....
        出差啦....
        公司上班
        */
        
        //注意:
        /*
        需要注意的地方有两点:
        Switch当然也支持显式的break,通常只有一种情况下会这么做,那就是当你也不想在default里做任何事情的时候,这个时候你就可以在default里显式地加上一句break。
        fallthrough并不是在任何情况下都有效,当你在Switch里使用Value Binding技术的时候,fallthrough就被禁止了。
        至于什么是Value Binding,等会儿在道来了。稍候一会啦....
        */
        
        /*
        史上最强大的switch:Swift中的Switch
        java Switch不支持字符串,但也可以采用枚举替代,OC中就更不支持了
        但是:swift就不一样了,它支持字符串,浮点型,boolean型,等诸多数据类型,甚至支持元组类型
        那么,请看下面啦
        */
        
        //eg:
        
        //区间值:
        var numOne = 50

        switch numOne {
        case 0 ... 100:
            println("0~100")    //输出:0~100
        case 101 ... 200:
            println("101~200")
        default:
            "default"  
        }
        //关于区间,使用" ... "来充当,上面的case中,很容易看出来,1-100之间的数,就在case 0 ... 100中截取
    
        //关于元组:
        let request = ("status","success")
        switch request {
        case ("status", "success"):
            println("success")   //输出:success
        case ("status", "failed"):
            println("failed")
        default:
            "default"  
        }
        //当然,元组有多种形式,可以添加很多数据类型的值,如果不懂的话,可以移步到元组栏仔细瞅瞅
        //比如:跳过不关心的值
        //eg:
        let (name,  _, age) = ("NapoleonBai" ,true, 22)
        
        //到这里,差点忘记上面说的value binding了,那么这里就借元组来说明一下下啦
        //当然,针对元组,Switch还支持类似于Optional Binding的Value Binding,就是能把元组中的各个值提取出来,然后直接在下面使用
        
        let requestCode = (404,"NOT FOUND")
        switch requestCode {
        case (404, let state):
            println(state)  //输出:NOT FOUND
            //fallthrough  //error:'fallthrough' cannot transfer control to a case label that declares vaiables
        case (let errorCode, _):
            println("error code is \(errorCode)")
        }
        
        //这样,就是一个VAlue Binding技术的使用了,这样就不能使用fallthrough了,如果使用的话,编译器直接抛出上面那个error:就通不过编译了,至于要怎么完成上面的那个继续执行下一个case,那么就需要自己另行想办法了...嘻嘻
        
        
    }
    
    //讲解switch
    func managerSwitch(num : Int){
        switch num{
        case 1:
            println("这是1")
            fallthrough
        case 2:
            println("这是2")
            fallthrough
        case 3:
            println("这是3")
            fallthrough
        case 4:
            println("这是4")
        case 5:
            println("这是5")
        default:
            println("其他")
        }
    }
    
    //swith的其他操作
    func managerSwitchTwo(day : DAYOFWEEK){
        switch day{
        case .MONDAY,.TUESDAY,.WEDNESDAY:
            println("公司上班")
        case .THURSDAY,.FRIDAY:
            println("出差啦....")
        default:
            println("休息")
        }
    }
    
    //打印其他枚举
    func managerEnumOther(otherEnum : OtherEnum){
        switch otherEnum{
        case .ERRORCODE(let code, let message):
            println("error code = \(code) ,message = \(message)")
        case .ERRORTYPE(let typeInfo):
            println("errortype = \(typeInfo)")
        }
    }
    
    override func didReceiveMemoryWarning() {
        super.didReceiveMemoryWarning()
        // Dispose of any resources that can be recreated.
    }


}

最后在介绍一点点啦:

我们可以使用枚举的toRaw()函数来获取它的初始值,当然,要有初始值才行哈

既然都有通过成员变量来获取其初始值,那么也就有通过初始值来查找成员变量的名称吧:

那就是fromRaw()函数,如果根据初始值没有找到,那么就会返回nil,而且注意,这里找到的都是非强制类型的数据,当然,

这里,就暂时把非强制类型理解为一个Object对象类型吧.以后再讲解... ...


一天一点,周末休息..嘻嘻

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值