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可以理解为指向自己的指针
最后说一下
枚举是值类型!!
枚举是值类型!!
枚举是值类型!!
网友评论