Swift - Structures and Classes
2018-10-23 本文已影响5人
ienos
Structures 和 Classes 的共同点
- 定义一个存储属性
- 定义一个提供功能的方法
- 定义下标提供访问他们的值
- 定义初始化器设置他们初始状态
- 扩展他们的方法
- 遵循协议
类有且结构体没有的能力
- 继承
- 类型转换
- 允许类的实例释放其分配的任何资源
- 引用计数
如何选择结构体和类
- 默认使用结构体
- 与 OC 混编时使用类
- 当需要控制数据的标识使用类(共享实例和本地数据库对象)
- 不需要控制标识时使用结构体(数据是从远程服务器获取)
- 结构体和协议分享行为和模型继承:优先使用协议继承,因为协议允许类、结构体和枚举。类只能兼容其他类。
定义
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()
// 结构体有默认的成员初始化
let vga = Resolution(width: 640, height: 480)
访问属性
someVideoMode.resolution.width
值类型 -- Structures / Enumerations
定义: 当分配一个常量或变量、传递到方法时都会 copy
Basic Type: Integer / Float / Bool / String / Array / Dictionary
集合类型(数组、字典、字符串)使用了内存优化,不是立即拷贝。他们共享存储元素的内存介于初始实例和任何 copy 对象之间。
如果修改了一个集合的 copy,元素在修改之前被拷贝。在代码中看到的行为就是立即拷贝。
let hd = Resolution(width: 1920, height: 1080)
var cinema = hd
cinema.width = 2048
print("cinema is now \(cinema.width) pixels wide") // 2048
print("hd is still \(hd.width) piels wide") // 1920
引用类型 -- Class
定义:分配一个变量或常量、传递到方法时没有 copy。与值类型相反,总是使用相同的实例
// new VideoMode
let tenEighty = VideoMode()
tenEighty.resolution = hd
tenEighty.interlaced = ture
tenEighty.name = "1080i"
tenEighty.frameRate = 25.0
let alsoTenEighty = tenEighty
alsoTenEighty.frameRate = 30.0
如果是引用类型,两个变量在源文件中相距甚远,很难发现是在哪里发生改变
标识操作符 -- 判断是否为同个实例
- ===
- !==
// 区别于 == 和 !=
if tenEighty === alsoTenEighty {
}
不需要像 C / C++ / ObjC 一样使用指针,引用同一个内存地址去创建引用。Swift 一个变量或常量去引用一个引用类型的实例(类似于指针),这些引用的定义和其他正常的常量和变量一致。