定义
- struct Resolution {
- var width = 0
- var height = 0
- }
- class VideoMode {
- var resolution = Resolution()
- var interlaced = false
- var frameRate = 0.0
- var name: String?
- }
- let someResolution = Resolution()
- let someVideoMode = VideoMode()
- print("The width of someResolution is \(someResolution.width)")
- // 输出 "The width of someResolution is 0"
- print("The width of someVideoMode is \(someVideoMode.resolution.width)")
- // 输出 "The width of someVideoMode is 0"
- someVideoMode.resolution.width = 1280
- print("The width of someVideoMode is now \(someVideoMode.resolution.width)")
- // 输出 "The width of someVideoMode is now 1280"
结构体成员逐一构造器
- let vga = Resolution(width:640,height: 480)
与结构体不同,类实例没有默认的成员逐一构造器。
结构体和枚举是值类型
- enum CompassPoint {
- case North,South,East,West
- }
- var currentDirection = CompassPoint.West
- let rememberedDirection = currentDirection
- currentDirection = .East
- if rememberedDirection == .West {
- print("The remembered direction is still .West")
- }
- // 输出 "The remembered direction is still .West"
类是引用类型
- let hd = Resolution(width: 1920,height: 1080)
- let tenEighty = VideoMode()
- tenEighty.resolution = hd
- tenEighty.interlaced = true
- tenEighty.name = "1080i"
- tenEighty.frameRate = 25.0
- let alsoTenEighty = tenEighty
- alsoTenEighty.frameRate = 30.0
- print("The frameRate property of tenEighty is now \(tenEighty.frameRate)")
- // 输出 "The frameRate property of theEighty is now 30.0"
需要注意的是tenEighty和alsoTenEighty被声明为常量((constants)而不是变量。
然而你依然可以改变tenEighty.frameRate和alsoTenEighty.frameRate,因为这两个常量本身不会改变。
它们并不存储这个VideoMode实例,在后台仅仅是对VideoMode实例的引用。
所以,改变的是被引用的基础VideoMode的frameRate参数,而不改变常量的值。
恒等运算符
- if tenEighty === alsoTenEighty {
- print("tenEighty and alsoTenEighty refer to the same Resolution instance.")
- }
- //输出 "tenEighty and alsoTenEighty refer to the same Resolution instance."
请注意“等价于"(用三个等号表示,===) 与“等于"(用两个等号表示,==)的不同:
“等价于”表示两个类类型(class type)的常量或者变量引用同一个类实例。
“等于”表示两个实例的值“相等”或“相同”,判定时要遵照类设计者定义定义的评判标准,因此相比于“相等”,这是一种更加合适的叫法。
类和结构体的选择
结构体实例总是通过值传递,类实例总是通过引用传递。这意味两者适用不同的任务。
当你在考虑一个工程项目的数据构造和功能的时候,你需要决定每个数据构造是定义成类还是结构体。
结构体的主要目的是用来封装少量相关简单数据值。
有理由预计一个结构体实例在赋值或传递时,封装的数据将会被拷贝而不是被引用。
任何在结构体中储存的值类型属性,也将会被拷贝,而不是被引用。
结构体不需要去继承另一个已存在类型的属性或者行为。
结构体的主要目的是用来封装少量相关简单数据值。
有理由预计一个结构体实例在赋值或传递时,封装的数据将会被拷贝而不是被引用。
任何在结构体中储存的值类型属性,也将会被拷贝,而不是被引用。
结构体不需要去继承另一个已存在类型的属性或者行为。
合适的结构体候选者包括:
几何形状的大小,封装一个width属性和height属性,两者均为Double类型。
一定范围内的路径,封装一个start属性和length属性,两者均为Int类型。
三维坐标系内一点,封装x,y和z属性,三者均为Double类型。
几何形状的大小,封装一个width属性和height属性,两者均为Double类型。
一定范围内的路径,封装一个start属性和length属性,两者均为Int类型。
三维坐标系内一点,封装x,y和z属性,三者均为Double类型。
集合类型的赋值和拷贝
Swift 中字符串(String),数组(Array)和字典(Dictionary)类型均以结构体的形式实现。