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.请注意,“等价于”(用三个等号表示,===
)与“等于”(用两个等号表示,==
)的不同:
10.按照通用的准则,当符合一条或多条以下条件时,请考虑构建结构体:
原文:http://www.cnblogs.com/guoxiaoqian/p/5118628.html