1.在 Swift 中,枚举类型是一等(first-class)类型。它们采用了很多在传统上只被类(class)所支持的特性,例如计算型属性(computed properties),用于提供枚举值的附加信息,实例方法(instance methods),用于提供和枚举值相关联的功能。枚举也可以定义构造函数(initializers)来提供一个初始值;可以在原始实现的基础上扩展它们的功能;还可以遵守协议(protocols)来提供标准的功能。
下面是用枚举表示指南针四个方向的例子:
enum CompassPoint {
case North
case South
case East
case West
}
枚举中定义的值(如 North ,South ,East 和West )是这个枚举的成员值(或成员)。你使用case 关键字来定义一个新的枚举成员值。
与 C 和 Objective-C 不同,Swift 的枚举成员在被创建时不会被赋予一个默认的整型值。在上面的CompassPoint 例子中,North ,South ,East 和West 不会被隐式地赋值为0 ,1 ,2 和3 。相反,这些枚举成员本身就是完备的值,这些值的类型是已经明确定义好的CompassPoint 类型。
2.var directionToHead = CompassPoint.West
directionToHead 的类型可以在它被CompassPoint 的某个值初始化时推断出来。一旦directionToHead 被声明为CompassPoint 类型,你可以使用更简短的点语法将其设置为另一个CompassPoint 的值:
directionToHead = .East
3.在 Swift 中,使用如下方式定义表示两种商品条形码的枚举:
enum Barcode {
case UPCA(Int, Int, Int, Int)
case QRCode(String)
}
以上代码可以这么理解:
“定义一个名为Barcode 的枚举类型,它的一个成员值是具有(Int,Int,Int,Int) 类型关联值的UPCA ,另一个成员值是具有String 类型关联值的QRCode 。”
这个定义不提供任何Int 或String 类型的关联值,它只是定义了,当Barcode 常量和变量等于Barcode.UPCA 或Barcode.QRCode 时,可以存储的关联值的类型。
productBarcode = .QRCode("ABCDEFGHIJKLMNOP")
这时,原始的Barcode.UPCA 和其整数关联值被新的Barcode.QRCode 和其字符串关联值所替代。Barcode 类型的常量和变量可以存储一个.UPCA 或者一个.QRCode (连同它们的关联值),但是在同一时间只能存储这两个值中的一个。
4.关联值可以被提取出来作为 switch 语句的一部分。你可以在switch 的 case 分支代码中提取每个关联值作为一个常量(用let 前缀)或者作为一个变量(用var 前缀)来使用:
switch productBarcode {
case .UPCA(let numberSystem, let manufacturer, let product, let check):
print("UPC-A: \(numberSystem), \(manufacturer), \(product), \(check).")
case .QRCode(let productCode):
print("QR code: \(productCode).")
}
// 输出 "QR code: ABCDEFGHIJKLMNOP."
5. Swift 中类和结构体有很多共同点。共同处在于:
- 定义属性用于存储值
- 定义方法用于提供功能
- 定义附属脚本用于访问值
- 定义构造器用于生成初始化值
- 通过扩展以增加默认实现的功能
- 实现协议以提供某种标准功能
与结构体相比,类还有如下的附加功能:
- 继承允许一个类继承另一个类的特征
- 类型转换允许在运行时检查和解释一个类实例的类型
- 解构器允许一个类实例释放任何其所被分配的资源
- 引用计数允许对一个类的多次引用
注意:结构体总是通过被复制的方式在代码中传递,不使用引用计数。
6.所有结构体都有一个自动生成的成员逐一构造器,用于初始化新结构体实例中成员的属性。新实例中各个属性的初始值可以通过属性的名称传递到成员逐一构造器之中:
let vga = Resolution(width:640, height: 480)
与结构体不同,类实例没有默认的成员逐一构造器。
7.实际上,在 Swift 中,所有的基本类型:整数(Integer)、浮点数(floating-point)、布尔值(Boolean)、字符串(string)、数组(array)和字典(dictionary),都是值类型,并且在底层都是以结构体的形式所实现。
在 Swift 中,所有的结构体和枚举类型都是值类型。这意味着它们的实例,以及实例中所包含的任何值类型属性,在代码中传递的时候都会被复制。
8.类是引用类型,引用类型在被赋予到一个变量、常量或者被传递到一个函数时,其值不会被拷贝。
9.请注意,“等价于”(用三个等号表示,=== )与“等于”(用两个等号表示,== )的不同:
- “等价于”表示两个类类型(class type)的常量或者变量引用同一个类实例。
- “等于”表示两个实例的值“相等”或“相同”
10.按照通用的准则,当符合一条或多条以下条件时,请考虑构建结构体:
- 该数据结构的主要目的是用来封装少量相关简单数据值。
- 有理由预计该数据结构的实例在被赋值或传递时,封装的数据将会被拷贝而不是被引用。
- 该数据结构中储存的值类型属性,也应该被拷贝,而不是被引用。
- 该数据结构不需要去继承另一个既有类型的属性或者行为。
|
请发表评论