Swift学习笔记(四)枚举、类、结构体

1. 枚举
①语法
[c]
enum CompassPoint {
case north
case south
case east
case west
}
[/c]
CompassPoint.south拥有隐式原始值south,依次类推。
②关联值
你可以定义 Swift 枚举来存储任意类型的关联值,如果需要的话,每个枚举成员的关联值类型可以各不相同。
[c]
//在 Swift 中,使用如下方式定义表示两种商品条形码的枚举:
enum Barcode {
case upc(Int, Int, Int, Int)
case qrCode(String)
}
var productBarcode = Barcode.upc(8, 85909, 51226, 3)
productBarcode = .qrCode("ABCDEFGHIJKLMNOP")
switch productBarcode {
case .upc(let numberSystem, let manufacturer, let product, let check):
print("UPC: \(numberSystem), \(manufacturer), \(product), \(check).")
case .qrCode(let productCode):
print("QR code: \(productCode).")
}
// 打印 "QR code: ABCDEFGHIJKLMNOP."
[/c]
③原始值
原始值可以是字符串,字符,或者任意整型值或浮点型值。每个原始值在枚举声明中必须是唯一的。
[c]
enum ASCIIControlCharacter: Character {
case tab = "\t"
case lineFeed = "\n"
case carriageReturn = "\r"
}
[/c]
[c]
enum Planet: Int {
case mercury = 1, venus, earth, mars, jupiter, saturn, uranus, neptune
}
[/c]
在上面的例子中,Plant.mercury的显式原始值为1,Planet.venus的隐式原始值为2,依次类推。
使用枚举成员的rawValue属性可以访问该枚举成员的原始值:
[c]
let earthsOrder = Planet.earth.rawValue
// earthsOrder 值为 3
[/c]
原始值构造器是一个可失败构造器,因为并不是每一个原始值都有与之对应的枚举成员。
[c]
let positionToFind = 11
if let somePlanet = Planet(rawValue: positionToFind) {
switch somePlanet {
case .earth:
print("Mostly harmless")
default:
print("Not a safe place for humans")
}
} else {
print("There isn’t a planet at position \(positionToFind)")
}
// 输出 "There isn’t a planet at position 11
[/c]
④递归枚举
你可以在枚举成员前加上indirect来表示该成员可递归。
[c]
indirect enum ArithmeticExpression {
case number(Int)
case addition(ArithmeticExpression, ArithmeticExpression)
case multiplication(ArithmeticExpression, ArithmeticExpression)
}
[/c]
2. 类和结构体
Swift 中类和结构体有很多共同点。共同处在于:
定义属性用于存储值
定义方法用于提供功能
定义下标操作使得可以通过下标语法来访问实例所包含的值
定义构造器用于生成初始化值
通过扩展以增加默认实现的功能
实现协议以提供某种标准功能

与结构体相比,类还有如下的附加功能:
继承允许一个类继承另一个类的特征
类型转换允许在运行时检查和解释一个类实例的类型
析构器允许一个类实例释放任何其所被分配的资源
引用计数允许对一个类的多次引用

①语法
[c]
class SomeClass {
// 在这里定义类
}
struct SomeStructure {
// 在这里定义结构体
}
[/c]
②结构体和枚举是值类型
实际上,在 Swift 中,所有的基本类型:整数(Integer)、浮点数(floating-point)、布尔值(Boolean)、字符串(string)、数组(array)和字典(dictionary),都是值类型,并且在底层都是以结构体的形式所实现。
③类是引用类型
④恒等运算符
等价于(===)
不等价于(!==)
“等价于”(用三个等号表示,===)与“等于”(用两个等号表示,==)的不同:
“等价于”表示两个类类型(class type)的常量或者变量引用同一个类实例。
“等于”表示两个实例的值“相等”或“相同”,判定时要遵照设计者定义的评判标准,因此相对于“相等”来说,这是一种更加合适的叫法。

⑤类和结构体的选择
按照通用的准则,当符合一条或多条以下条件时,请考虑构建结构体:
该数据结构的主要目的是用来封装少量相关简单数据值。
有理由预计该数据结构的实例在被赋值或传递时,封装的数据将会被拷贝而不是被引用。
该数据结构中储存的值类型属性,也应该被拷贝,而不是被引用。
该数据结构不需要去继承另一个既有类型的属性或者行为。