Swift枚举

1.枚举型个人理解
枚举在各种语言中都可以看得到,swift也不会错过,那么枚举能做什么呢,简单来说,枚举可以表示有限种属性\状态的事务。如一个方向,可以分为东、西、南、北 ;成绩可分为�不及格、及格、良、优等

2.枚举型创建
下面说一下怎么使用,使用很简单

enum Season {
    case Spring 
    case Summer 
    case Autumn 
    case Winter
}

这样就创建了一个Season的枚举类型,当然还有一种省去case的书写方法

enum Season {
    case Spring ,Summer ,Autumn , Winter
}

这样用","来代替case也是可以的 但是这里有一个注意 就是当你的枚举值很多的时候 ,还是推荐使用功能上面的创建方式 ,这样可以让代码更加清晰

3.枚举型的使用
创建完成后怎么使用,因为enum是一种结构体,这样他的使用方法就跟一般都的结构体使用方式一样

let seasonInYear = Season.Spring

这样就隐式创建了一个Season类型的seasonInYear,同样我们可以显示创建一个Season类型 如:

let seasonInYear:Season = .Spring

因为我们显示声明了seasonInYear是Season类型,所以我们在后面进行赋值的时候直接用.Spring 代替Season.Spring,这一特点在后面我们也会用到

有另外一个枚举值来存储四个季节对应的花 //迎春花,荷花,菊花,梅花

enum Flower {
    case primroses,lotus,chrysanthemums,plumBlossom
}

创建一个方法 ,当你传入一个季节后,返回对应季节的花

func flowerInSeason(season:Season)->Flower{
    switch season {
    case .Spring:
        return .Primroses
    case .Summer:
        return .Lotus
    case .Autumn:
        return .Chrysanthemums
    case .Winter:
        return .PlumBlossom
    }
}

这里我们也用到了刚才说到的 ,当你确定一个变量是明确的某个enum类型的时候 可以只输入".enumName"来缩写

4.RawValue
下面说一下raw Value的问题 就是可以在创建枚举类型的时候 对枚举值赋予初始值 如:

enum Season :Int{
    case Spring = 1 
    case Summer 
    case Autumn 
    case Winter
}

这样你可以通过seasonInYear.rawValue来获取到对应的初始值
这里有必要说明一下,当你定义初始值类型为Int时,当你给Spring赋值为1时,默认Summer为2,Autumn为3...

enum Season :Int{
    case Spring = 1 
    case Summer 
    case Autumn = 5
    case Winter
}

假如我设置Autumn为5时Winter为多少呢,大家可以试一下 ,不出意外是6
我们知道了通过枚举值获取到对应的rawValue ,那我们如何通过rawValue获取到对应的枚举值呢

 let seasonInYear = Season.init(rawValue:6)

这样我们就得到了Season.Winter 如果你输入的是7结果会怎样呢 所以方法返回的是一个Optional 这里需要注意哦 !

5.AssociateValue
关联值的使用时很有意思的,在初始化的时候并不给其赋值,但是在程序执行中可以对其进行赋值
如你想知道你的考试有没有及格 同事还想知道你的分数 ,让我们来模拟一下

enum Achievement {
    case Pass(Double)
    case Failed(Double)
}

这时候我们就创建了 Pass 和Failed分别是(Double)类型的关联值
下面我们创建一个方法根据分数返回枚举值

func achievementWithScore(score:Double)->Achievement{
    if  score >= 60 {
        return .Pass(score)
    }else{
        return .Failed(score)
    }
}

然后在创建一个方法来打印你的结果和分数

func yourAchievement(achievement:Achievement){
    switch achievement {
     //这里需要注明  你不能确定你的score是一定有值得  也可能是一个nil所以你需要先解包才可以
    case let .Pass(score):
        print("you are pass your score is \(score)")
    case let .Failed(score):
        print("you are failed your score is \(score)")
    }
}

然后试用一下看一下效果

let yourScore = achievementWithScore(70)
yourAchievement(yourScore)
let yourScore1 = Achievement.Pass(80)
yourAchievement(yourScore1)

需要注意的是关联值 与RawValue不能同时声明 ,否则会报错

最后说一下swift中的枚举大Bug 在我看来是Bug 就是枚举里面可以有方法
让我们来改变一下前面,通过季节 获取到对应季节的花的枚举类型

enum Season {
    case Spring ,Summer ,Autumn , Winter
    func flowerInSeason()->Flower{
        switch self {
        case .Spring:
            return .Primroses
        case .Summer:
            return .Lotus
        case .Autumn:
            return .Chrysanthemums
        case .Winter:
            return .PlumBlossom
        }
    }
}

这里使用到了self self可以理解为指向自己的指针

最后说一下
枚举是值类型!!
枚举是值类型!!
枚举是值类型!!

你可能感兴趣的:(Swift枚举)