从 Playgrounds 论 Swift(九): 类和结构体(Classes and Structures)
从 Playgrounds 论 Swift(9): 类和结构体(Classes and Structures)
转载请声明出处:http://blog.****.net/jinnchang/article/details/43273783
注意:在众多的数据类型中,只有类是引用类型,其它类型全部是值类型。
== : 表示两个实例的值“相等”或“相同”。(相对:!=)
按照通用的准则,当符合一条或多条以下条件时,请考虑构建结构体:
实际中,这意味着绝大部分的自定义数据构造都应该是类,而非结构体。
欲了解更细致的请参考官方文档:Classes and Structures
转载请声明出处:http://blog.****.net/jinnchang/article/details/43273783
1、类和结构体的对比
(1)共同点- 定义属性用于储存值
- 定义方法用于提供功能
- 定义下标用于通过下标语法访问值
- 定义初始化器用于生成初始化值
- 通过扩展以增加默认实现的功能
- 符合协议以对某类提供标准功能
- 继承性。允许一个类继承另一个类的特征
- 类型转换。允许在运行时检查和解释一个类实例的类型
- 析构器。允许一个类实例释放任何其所被分配的资源
- 引用计数。允许对一个类的多次引用
2、类和结构体的使用
// 定义结构体 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() // 访问属性 println(someResolution.width) // 0 // 访问子属性 println(someVideoMode.resolution.width) // 0 // 为属性变量赋值 someVideoMode.resolution.width = 1280 println(someVideoMode.resolution.width) // 1280 // 成员逐一初始化器(只有结构体有,类没有) let vga = Resolution(width: 640, height: 480)
3、结构体是值类型,类是引用类型
// 结构体是值类型 let hd = Resolution(width: 1920, height: 1080) var cinema = hd cinema.width = 2048 println(hd.width) // 1920 println(cinema.width) // 2048 // 类是引用类型 let tenEighty = VideoMode() tenEighty.frameRate = 25.0 let alsoTenEighty = tenEighty alsoTenEighty.frameRate = 30.0 println(tenEighty.frameRate) // 30.0 println(alsoTenEighty.frameRate) // 30.0上述例子中,结构体被传递的时候实际上操作的是其拷贝。而类被传递的时候引用的是已存在的实例本身。
注意:在众多的数据类型中,只有类是引用类型,其它类型全部是值类型。
4、恒等运算符
=== : 表示两个类类型(class type)的常量或者变量引用同一个类实例。(相对:!==)== : 表示两个实例的值“相等”或“相同”。(相对:!=)
println(tenEighty === alsoTenEighty) //true
5、类和结构体的选择
由于类和结构体的类型不同,意味着他们适用的场景也不尽相同。那么,我们到底该如何选择呢?按照通用的准则,当符合一条或多条以下条件时,请考虑构建结构体:
- 结构体的主要目的是用来封装少量相关简单数据值。
- 能够预计一个结构体实例在赋值或传递时,封装的数据将会被拷贝而不是被引用。
- 任何在结构体中储存的值类型属性,也将会被拷贝,而不是被引用。
- 结构体不需要去继承另一个已存在类型的属性或者行为。
实际中,这意味着绝大部分的自定义数据构造都应该是类,而非结构体。
6、结语
文章最后更新时间:2015年1月30日09:21:12。欲了解更细致的请参考官方文档:Classes and Structures