009-Swift3.0之类和结构体
一、类和结构体的对比
1.共同点
1)定义属性用于存储值
2)定义方法用于提供功能
3)定义下标操作使得可以通过下标语法来访问实例所包含的值
4)定义构造器用于生成初始化值
5)通过扩展以增加默认实现的功能
6)实现协议以提供某种标准功能
2.与结构体相比,还有如下功能
1)继承允许一个类继承另一个类的特征
2)类型转换允许在运行时检查和解释一个类实例的类型
3)析构器允许一个类实例释放任何其所被分配的资源
4)引用计数允许对一个类的多次引用
注意:结构体总是通过被复制的方式在代码中传递,不使用引用计数
二、语法
类名、结构体名使用大驼峰命名法,属性和方法命名使用小驼峰命名法
class SomeClass { // 类 } struct SomeStructure { // 结构体 }
示例
class VideoMode { var resolution = Resolution() var interlaced = false var frameRate = 0.0 var name: String? func printHello(content: String) { print(content) } } struct Resolution { var width = 0 var height = 0 }
三、类和结构体实例
class UserMode { var figure = Result() var isStudent = true var age = 0 var name: String? func printHello(content: String) { print(content) } } struct Result { var weight = 0 var height = 0 } // 1)生成类和结构体实例 let userModel = UserMode() let result = Result() // 2)属性访问 // 通过使用点语法,你可以访问实例的属性 let age = userModel.age let weight = userModel.figure.weight
四、结构体类型的成员逐一构造器
struct Person { var name: String var sex: String } let boy = Person(name: "fuguanlin", sex: "boy")
五、值类型&引用类型
1.值类型
结构体个枚举都是值类型
在Swift中,所有的基本类型:整数、浮点数、布尔值、字符串、数组和字典,都是值类型
值类型被赋予给一个变量、常量或者被传递给一个函数的时候,其值会被拷贝
struct Animal { var name: String var sex: String } let monkey = Animal(name: "猴子", sex: "公") var cat = monkey // monkey的值被拷贝一份给cat,当改变cat不会改变monkey cat.name = "小猫" cat.sex = "母" print(monkey) // Animal(name: "猴子", sex: "公") print(cat) // Animal(name: "小猫", sex: "母")
2.引用类型
引用类型在被赋予到一个变量、常量或者被传递到一个函数时,其值不会被拷贝
因此,引用的是已存在的实例本身而不是其拷贝
class Pet { var name: String = "" var sex: String = "" } let cat1 = Pet() cat1.name = "小喵咪" cat1.sex = "公" let cat2 = cat1 // 改变cat2的属性值时,cat1的属性值也发生改变,cat1和cat2指向同一片内存空间 cat2.name = "老喵咪" cat2.sex = "母" print("cat1:\(cat1.name), \(cat1.sex)") // cat1:老喵咪, 母 print("cat2:\(cat2.name), \(cat2.sex)") // cat2:老喵咪, 母
3.恒等运算符
对于引用类型来讲,有可能存在对个常量和变量在幕后同时引用同一个类实例
这就类似于C语言中的指针,内存中的一块空间可能存在多个指针同时指向
等价于:===
不等价于:!==
恒等运算符尝尝用来检测两个常量或者变量是否引用同一个实例
注意:“等价于”表示两个类类型的常量或者变量引用同一个类实例,“等于”表示两个实例的值相等
class Rectangle { var width: Int = 0 var height: Int = 0 } var rectangle1 = Rectangle() var rectangle2 = rectangle1 if rectangle1 === rectangle2 { print("rectangle1和rectangle2同时指向内存空间中同一块内存") }

浙公网安备 33010602011771号