SwiftNote-7
2016年05月05日 Swift

枚举

  • 枚举语法

    enum关键字接大括号,内部case分隔不同的枚举值,也可以多个枚举值在同一个case后,用逗号分隔,在Swift里枚举是一种自定义类型,Swift对其功能进行了增强

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    enum 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
    8
    let 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
    10
    enum 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
    8
    enum 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
    16
    enum 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++是一样的,都是使用classstruct关键字,并且Swift对结构体的功能做了增强,定义一个类或者结构体,class/struct关键字后接大括号,内部定义属性/方法

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    class DemoClass
    {
    var demoMember:String = "DefaultValue"
    }

    struct DemoStruct
    {
    let demoMember:Int32 = 42
    var noneDefaultValue:Bool
    }
    // 可以定义所有的基本类型,自定义类型等在class和strut里

    与其他面向对象语言相似,都使用类名使用大写驼峰命名法,属性与方法使用小写驼峰命名法,具体内容可参照Wiki

  • 实例化类/结构体

    与C++类似,类名(参数表)的形式

    1
    2
    var dc = DemoClass()
    let ds = DemoStruct(noneDefaultValue:false) // 结构体默认提供构造方法带未初始化内部成员
  • 成员访问(属性访问)

    使用点号.,常量属性初始后不可更改,常量实例不可对其属性进行赋值

    1
    2
    dc.demoMember = "assignStringFromExternal"
    // ds.noneDefaultValue = true // 报错 ds是常量
  • 结构体默认提供了结构体内属性的初始化构造方法,类并不提供

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    struct 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
    5
    var dcc = dc
    if dcc === dc
    {
    print("dcc same as dc")
    }