1.结构体和类的对比
- 定义属性用于存储值
- 定义方法用于提供功能
- 定义下标操作用于通过下标语法访问它们的值
- 定义构造器用于设置初始值
- 通过扩展以增加默认实现之外的功能
- 遵循协议以提供某种标准的功能
2.与结构体相比,类有的附加功能
- 继承:允许一个类继承于另一个类的特征
- 类型转换允许在运行时检查和解释一个类实例的类型
- 析构器允许一个类实例释放任何其所分配的资源
- 引用计数允许对一个类的多次引用
类支持的附加功能是以增加复杂性为代价的。作为一般原则,优先使用结构体,因为它们更容易理解,仅在适当或者必要时才使用类
实际上:你的大多数自定义数据类型都会是
结构体
和枚举
//类与结构体
*/
struct SomeStructure {
}
class PJSomeClass {
}
struct PJResolution {
var width = 0
var height = 0
}
class PJVideoMode {
var resolution = PJResolution()
var interlaced = false
var frameRate = 0.0
var name: String?
}
let someRe = PJResolution()
let someVideoMode = PJVideoMode()
someVideoMode.resolution.width = 10
someVideoMode.resolution.height = 20
print("someRe is \(someVideoMode.resolution.width) ,op = \(someVideoMode.interlaced) ppp = \(String(describing: someVideoMode.name))")
//结构体和类都使用构造器语法来创建新的实例。构造器语法的最简形式是在结构体或者类的类型名字后跟着一个空括号
//结构体类型的成员逐一构造器
//所有的结构体都一个自动生成的成员逐一构造器,用于初始化新结构体中成员的属性。
//类实例没有默认的成员逐一构造器
let vga = PJResolution(width: 23, height: 98)
//结构体和枚举是值类型
//标准库定义的集合,例如:数组、字典、字符串,都对复制进行了优化以降低性能成本。新集合不会被立即复制,而是跟原集合共享同一份内存
//共享同样的元素,在集合的某个副本要被修改前,下回复制它的元素
let hfgg = PJResolution(width: 1920, height: 1080)
var cinme = hfgg
cinme.width = 20000
print(cinme)
enum CompassPoint {
case north , south , east ,west
mutating func turnNorth(){
self = .north
}
}
var currentDirection = CompassPoint.west
let rememberDirection = currentDirection
currentDirection.turnNorth()
print(currentDirection) // morth
print(rememberDirection) //west
//类是引用类型
//与值类型不同,引用类型再被赋予到一个变量、常量或者被传递到一个函数时,其值不会被拷贝,使用的是实例的引用,而不是其拷贝
let tenenrt = PJVideoMode()
tenenrt.resolution = hfgg
tenenrt.interlaced = true
tenenrt.name = "1080i"
tenenrt.frameRate = 34.5
print(tenenrt)
let alseTen = tenenrt
alseTen.frameRate = 30.0
print(alseTen)
//恒等运算符
//类是引用类型,所以多个长量和变量可能在幕后同时引用同一个类实例
//用来检测两个变量或者常量是不是引用的同一类实例
if tenenrt === alseTen {
print("tenenrt and alseTen refer to the same Mode instance")
}
//=== 相同 表示两个类类型(class type)的常量或者变量引用同一个类实例
//== “等于”表示两个实例的值“相等”或“等价”
网友评论