Swift - 结构体和类
前言
1 - 类和结构体都是构造体。Swift 并不要求你为自定义类和结构去创建独立的接口和实现文件,往往是在一个单一文件中定义一个类或者结构体,系统将会自动生成面向其它代码的外部接口
2 - Swift 中结构体和类有很多共同点
① 定义属性用于存储值
② 定义方法用于提供功能
③ 定义下标操作用于通过下标语法访问它们的值
④ 定义构造器用于设置初始值
⑤ 通过扩展以增加默认实现之外的功能
⑥ 遵循协议以提供某种标准功能
3 - 同结构体相比,类还有以下附加功能
① 继承允许一个类继承另一个类的特征
② 类型转换允许在运行时检查和解释一个类实例的类型
③ 析构器允许一个类实例释放任何其所被分配的资源
④ 引用计数允许对一个类的多次引用
类 | 结构体
1 - 创建
① 通过关键字 class 和 struct 来分别表示类和结构体
② 命名规范:类和结构命名采用 UpperCamelCase; 属性和方法命名采用 lowerCamelCase
1 // 通过关键字class和struct来分别表示类和结构体 2 // 类和结构命名: UpperCamelCase 3 // 属性和方法命名:lowerCamelCase 4 // 每次定义一个新类或者结构体的时候,实际上你是有效地定义了一个新的 Swift 类型 5 struct SomeStructure { 6 7 var width = 0 8 var heigth = 0 9 10 // 定义函数 11 func sayHello(){ 12 print("hello SomeStructure") 13 } 14 } 15 16 // 类中可以包括属性、方法;但是类中没有实例变量的概念,都称之为属性 17 class SomeClass { 18 19 // 当我们在类中声明一个属性的时 20 // 必须属性设置一个默认初值,这是有 swift 中构造函数的安全所致 21 // 当我们不给属性赋值,就要自己创造一个构造方法(在构造方法中完成新增属性的赋值) 22 var someStruct = SomeStructure() 23 var interlaced = false 24 var frameRate = 0.0 25 var name: String? // name 属性会被自动赋予一个默认值 nil 26 27 28 func SClass(){ 29 print("frameRate = \(frameRate),name= \(name!)") 30 } 31 }
2 - 生成实例
// 构造器语法的最简单形式是在结构体或者类的类型名称后跟随一个空括弧,这种方式均会被初始化为默认值 // 结构体和类都使用构造器语法来生成新的实例 let someCla = SomeClass() let someStruct = SomeStructure()
3 - 属性访问:点语法
print("The width is \(someStruct.width)") print("The width is \(someCla.someStruct.width)") // 属性赋值:与 OC语言不同的是 Swift 允许直接设置结构体属性的子属性 someCla.someStruct.width = 996 // 所有结构体都有一个自动生成的成员逐一构造器,但是类实例没有默认的成员逐一构造器 let vga = SomeStructure(width:640, heigth: 480)
4 - 在 Swift 中所有的结构体和枚举都是值类型;类是是引用类型。类可以被继承,而结构体不可以 (本质的区别)
1 // 验证结构体是值类型 2 let hd = SomeStructure(width: 1920, heigth: 1080) 3 var cinema = hd // cinema 的值其实是 hd 的一个拷贝副本,而不是 hd 本身 4 // 修改数据 5 cinema.width = 2048 6 print("cinema is now \(cinema.width) pixels wide") // 2048 7 print("hd is still \(hd.width ) pixels wide") // 1920 8 9 // 验证类是引用类型 10 let tenEighty = SomeClass() 11 tenEighty.someStruct = hd 12 tenEighty.interlaced = true 13 tenEighty.name = "1080i" 14 tenEighty.frameRate = 25.0 15 16 // 修改数据 17 let alsoTenEighty = tenEighty 18 alsoTenEighty.frameRate = 30.0 19 print("now \(tenEighty.frameRate)") // 30
5 - Swift 内建了两个恒等运算符:等价于 === 和 不等价于 !==。表示两个类类型的常量或者变量引用同一个类实例(注意区分等于号 == 表示两个实例的值相等)
if tenEighty === alsoTenEighty { print("tenTighty and alsoTenEighty refer to the same Resolution instance.") } // 一个 Swift 常量或者变量引用一个引用类型的实例与 C语言中的指针类似 // 不同的是并不直接指向内存中的某个地址,而且也不要求你使用星号 *