枚举
枚举语法
enum关键字接大括号,内部case分隔不同的枚举值,也可以多个枚举值在同一个case后,用逗号分隔,在Swift里枚举是一种自定义类型,Swift对其功能进行了增强
1
2
3
4
5
6
7
8
9
10
11
12enum Color
{
case RED
case GREEN
case BLACK
case GRAY
}
enum RecommondType
{
case PERFEECT, RECOMMOND, QUALIFIED
}
var color = Color.RED使用点号访问枚举值,确定其类型后,可以直接使用点号后加枚举值的形式
1
color = .BLACK // 前面已知道color是Color类型的
switch 匹配枚举的值
必须匹配所有枚举值的情况
1
2
3
4
5
6
7
8let c = Color.GRAY
switch c
{
case .RED:
print("Color id Red")
case (let color):
print(" handle all ")
}关联值,都知道C语言的枚举默认都是整型的,指定的数字开始依次向后加,Swift增强了关联值,每个不同的枚举值可以关键完成不同的值类型,比如可以关联字符串,整型,元组等
1
2
3
4
5
6
7
8
9
10enum ColorShow
{
case ColorString(String)
case ColorDec(Int, Int, Int)
case ColorHex(Int)
}
var red = ColorShow.ColorHex(0xFFFF7777)
red = ColorShow.ColorDec(255, 0, 0)
red = ColorShow.ColorString("Red")一种颜色的三种不表现方式,分别是字符串,十进制数,十六进制数,类似于C语言的联合,同一时间只有一个存在。
原始值,枚举在定义是可以有必须类型相同的初始值,如果枚举定义时显式指定枚举是整型或者字符串时,原始值会隐式进行赋值,整型会默认依次递增1,字符串会默认是枚举值的字符串值
1
2
3
4
5
6
7
8enum Order:Int
{
case zero, fir, sec, thir // 依次是 0, 1, 2, 3
}
enum Dir:String
{
case W, E, S, N // 依次是 "W" "E" "S" "N"
}用原始值初始化新枚举值
如果使用原始值创建了枚举,那枚举就会自动生成一个带rawValue的初始化方法,用这个初始值去枚举定义里找对应的枚举值,有可能找不到,所以返回的是可选值,需要在拿到返回值时值绑定判定一下非空,可以使用这个初始化方法创建一个新枚举实例
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16enum Order:Int
{
case fir, sec, thir
}
enum Dir:String
{
case W, E, S, N
}
if let up = Dir(rawValue: "U")
{
// some code
}
else
{
print("Up dir not found")
}
类/结构体概念
定义类/结构体,这与C++是一样的,都是使用class和struct关键字,并且Swift对结构体的功能做了增强,定义一个类或者结构体,class/struct关键字后接大括号,内部定义属性/方法
1
2
3
4
5
6
7
8
9
10
11class DemoClass
{
var demoMember:String = "DefaultValue"
}
struct DemoStruct
{
let demoMember:Int32 = 42
var noneDefaultValue:Bool
}
// 可以定义所有的基本类型,自定义类型等在class和strut里与其他面向对象语言相似,都使用类名使用大写驼峰命名法,属性与方法使用小写驼峰命名法,具体内容可参照Wiki。
实例化类/结构体
与C++类似,类名(参数表)的形式
1
2var dc = DemoClass()
let ds = DemoStruct(noneDefaultValue:false) // 结构体默认提供构造方法带未初始化内部成员成员访问(属性访问)
使用点号.,常量属性初始后不可更改,常量实例不可对其属性进行赋值
1
2dc.demoMember = "assignStringFromExternal"
// ds.noneDefaultValue = true // 报错 ds是常量结构体默认提供了结构体内属性的初始化构造方法,类并不提供
1
2
3
4
5
6
7
8
9
10struct Person
{
var age:Int16 = 0
var name:String = ""
var address:String = ""
var height:Float = 0.0
}
// 并不需要在结构体内部定义初始构造方法,就可以直接调用
let p = Person(age: 27, name: "bugcode", address: "BeiJing", height: 65.5)如果将上文中的struct改为class,下面的实例构造处就会报错,因为类内部并没有定义对应的构造方法。
类是引用类型,结构体和其他的Swift的基础类型(包括集合)都是值类型,Swift引入了恒等去处符来确定二个变量/常量是否引用了同一个类实例,分别是===/!==
1
2
3
4
5var dcc = dc
if dcc === dc
{
print("dcc same as dc")
}