首页 > 代码库 > 结构体与类
结构体与类
最近开始想学习下Swift,下了Swift3.0中文版PDF,间断性看了几天,发现看不进去,所以还是从实践上学习吧,直接创建工程搭代码,多问度娘.
在此记录下对结构体与类的理解,之前学OC很少碰自定义结构体,所以理解上比较模糊混淆.好吧,我不是个合格的初级开发者.
结构体与类很相似,如初始化和属性访问,定义语法区别关键字struct和class.
在日常开发中,Swift在两者选择上建议第一选择是结构体
<style>p.p1 { margin: 0.0px 0.0px 0.0px 0.0px; font: 18.0px "PingFang SC" } span.s1 { font: 18.0px Menlo; color: #0435ff } span.s2 { font: 18.0px Menlo } span.s3 { }</style> <style>p.p1 { margin: 0.0px 0.0px 0.0px 0.0px; font: 18.0px "PingFang SC" } p.p2 { margin: 0.0px 0.0px 0.0px 0.0px; font: 18.0px Menlo; min-height: 21.0px } p.p3 { margin: 0.0px 0.0px 0.0px 0.0px; font: 18.0px Menlo } p.p4 { margin: 0.0px 0.0px 0.0px 0.0px; font: 13.0px SimSun } span.s1 { font: 18.0px Menlo; color: #0435ff } span.s2 { font: 18.0px Menlo } span.s3 { } span.s4 { font: 18.0px "PingFang SC" } span.s5 { }</style>
1.结构体是值类型, 类是引用类型.
结构体: 值类型被赋予给一个变量、常量或者被传递给一个函数的时候,其值会被拷贝。
类: 引用类型在被赋予到一个变量、常量或者被传递到一个函数时,其值不会被拷贝。
2.结构体都有一个自动生成成员逐一构造器,用于初始化实例中成员的属性.
如: let vga = Resolution1(width:640, height: 480)
3.恒等运算符
因为类是引用类型,有可能有多个常量和变量在幕后同时引用同一个类实例。(对于结构体和枚举来说,这并不成立。因为它们作为值类型,在被赋予到常量、变量或者传递到函数时,其值总是会被拷贝。)
如果能够判定两个常量或者变量是否引用同一个类实例将会很有帮助。为了达到这个目的,Swift 内建了两个恒等运算符:
? 等价于(===)
? 不等价于( !== )
4.类和结构体的选择
在你的代码中,你可以使用类和结构体来定义你的自定义数据类型。
然而,结构体实例总是通过值传递,类实例总是通过引用传递。这意味两者适用不同的任务。当你在考虑一个工程项目的数据结构和功能的时候,你需要决定每个数据结构是定义成类还是结构体。
按照通用的准则,当符合一条或多条以下条件时,请考虑构建结构体:
? 该数据结构的主要目的是用来封装少量相关简单数据值。
? 有理由预计该数据结构的实例在被赋值或传递时,封装的数据将会被拷贝而不是被引用。
? 该数据结构中储存的值类型属性,也应该被拷贝,而不是被引用。
? 该数据结构不需要去继承另一个既有类型的属性或者行为。
举例来说,以下情境中适合使用结构体:
? 几何形状的大小,封装一个 width 属性和 height 属性,两者均为 Double 类型。
? 一定范围内的路径,封装一个 start 属性和 length 属性,两者均为 Int 类型。
? 三维坐标系内一点,封装 x , y 和 z 属性,三者均为 Double 类型。
在所有其它案例中,定义一个类,生成一个它的实例,并通过引用来管理和传递。实际中,这意味着绝大部分的自定义数据构造都应该是类,而非结构体。
5.字符串、数组、和字典类型的赋值与复制行为
Swift 中,许多基本类型,诸如 String , Array 和 Dictionary 类型均以结构体的形式实现。这意味着被赋值给 新的常量或变量,或者被传入函数或方法中时,它们的值会被拷贝。
Objective-C 中 NSString , NSArray 和 NSDictionary 类型均以类的形式实现,而并非结构体。它们在被赋值或 者被传入函数或方法时,不会发生值拷贝,而是传递现有实例的引用。
//注意 以上是对字符串、数组、字典的“拷贝”行为的描述。在你的代码中,拷贝行为看起来似乎总会发生。然而,Swift 在幕后只在绝对必要时才执行实际的拷贝。Swift 管理所有的值拷贝以确保性能最优化,所以你没必要去回 避赋值来保证性能最优化。
以上是目前对结构体与类区别的记录,后续继续学习和补充.
<style>p.p1 { margin: 0.0px 0.0px 0.0px 0.0px; font: 18.0px Menlo } span.s1 { color: #c32275 } span.s2 { } span.s3 { color: #539aa4 } span.s4 { color: #0435ff }</style>
结构体与类