3.1、枚举
//: Playground - noun: a place where people can play
import UIKit
/*
枚举简单的说也是一种数据类型,只不过是这种数据类型只包含自定义的特定数据,它是一组有共同特性的数据的集合。
Swift 的枚举类似于 Objective C 和 C 的结构,枚举的功能为:
它声明在类中,可以通过实例化类来访问它的值。
枚举也可以定义构造函数(initializers)来提供一个初始成员值;可以在原始的实现基础上扩展它们的功能。
可以遵守协议(protocols)来提供标准的功能。
Swift中的枚举比OC中的枚举强大, 因为Swift中的枚举是一等类型, 它可以像类和结构体一样增加属性和方法
格式:
enum Method{
case 枚举值
}
*/
enumMethod{
// case Add
// case Sub
// case Mul
// case Div
// 可以连在一起写
caseAdd, Sub, Mul, Div
}
// 可以使用枚举类型变量或常量接收枚举值
varm:Method= .Add
// 注意: 如果变量或常量没有指定类型, 那么前面必须加上该值属于哪个枚举类型
varm1 =Method.Add
// 利用Switch匹配
// 注意: 如果case中包含了所有的值, 可以不写default. 如果case中没有包含枚举中所有的值, 必须写default
funcmakeChoiceMethod(op:Method)->(Double,Double)->Double{
switch(op){
case.Add:
print("加法")
funcadd(a:Double,b:Double)->Double{
returna+b
}
returnadd
case.Sub:
print("减法")
return{(a:Double,b:Double)->Doubleinreturna-b}
case.Mul:
print("除法")
return {return $0 * $1}//利用类型推断,使用$符号,省略写成$0 * $1
case.Div:
print("乘法")
return{ $0 / $1 }
//default:
// print("都不是")
}
}
makeChoiceMethod(op: .Add)(5,4)
makeChoiceMethod(op: .Mul)
/*
相关值与原始值的区别
原始值:相同数据类型
实例: enum {10,35,50}
预先填充的值
原始值始终是相同的,不会发生改变
相关值:不同数据类型
实例: enum {10,0.8,"Hello"}
值的创建基于常量或变量
相关值是当你在创建一个基于枚举成员的新常量或变量时才会被设置,并且每次当你这么做得时候,它的值可以是不同的。
*/
//原始值可以是字符串,字符,或者任何整型值或浮点型值。每个原始值在它的枚举声明中必须是唯一的。
//在原始值为整数的枚举时,不需要显式的为每一个成员赋值,Swift会自动为你赋值。
// 和OC中的枚举一样, 也可以指定原始值, 后面的值默认+1
enumMethod3:Int{
caseAdd =5, Sub, Mul, Div
}
Method3.Add.rawValue
Method3.Sub.rawValue
Method3.init(rawValue:6)
// Swift中的枚举除了可以指定整形以外还可以指定其它类型, 但是如果指定其它类型, 必须给所有枚举值赋值, 因为不能自动递增
enumMethod4:Double{
// 可以连在一起写
caseAdd =5.0, Sub =6.0, Mul =6.1, Div =8.0
}
// rawValue代表将枚举值转换为原始值
print(Method4.Sub.rawValue)
// 原始值转换为枚举值
enumMethod5:String{
caseAdd ="add", Sub ="sub", Mul ="mul", Div ="div"
}
// 通过原始值创建枚举值
/*
注意:
1.原始值区分大小写
2.返回的是一个可选值,因为原始值对应的枚举值不一定存在
3.老版本中为fromRaw("add")
*/
letm2 =Method5(rawValue:"add")
print(m2??"1")
print("\(String(describing:m2))")
//func chooseMethod(op:Method2)
funcchooseMethod(op:String)
{
// 由于返回是可选类型, 所以有可能为nil, 最好使用可选绑定
ifletopE =Method5(rawValue: op){
switch(opE){
case.Add:
print("加法")
case.Sub:
print("减法")
case.Mul:
print("除法")
case.Div:
print("乘法")
}
}
}
chooseMethod(op: "div")
/*
枚举相关值:
可以让枚举值对应的原始值不是唯一的, 而是一个变量.
每一个枚举可以是在某种模式下的一些特定值
以下实例中我们定义一个名为 Student 的枚举类型,它可以是 Name 的一个字符串(String),或者是 Mark 的一个相关值(Int,Int,Int)。
*/
enumStudent{
caseName(String)
caseMark(Int,Int,Int)
}
varstudDetails =Student.Name("Runoob")
varstudMarks =Student.Mark(98,97,95)
switch studMarks {
case.Name(letstudName):
print("学生的名字是: \(studName)。")
case.Mark(letMark1,letMark2,letMark3):
print("学生的成绩是: \(Mark1),\(Mark2),\(Mark3)。")
}
//练习page 330
//1、下列哪一项最能代表枚举?2
//房间里的人的名字。
//政党
//地址
//指南针度
//2、2
//3、1 3 4
//A汽车制造商
//C专业的篮球队
//D鞋的品牌