1.swift中类和结构体有很多共同点。
1.定义属性用于存储值
2.定义方法用于提供功能
3.定义下标用于通过下标语法访问值
4.定义初始化器用于生成初始化值
5.通过扩展以增加默认实现的功能
2.和结构体相比累还有如下特有的功能:
1.继承允许一个类继承另一个类的特征
2.类型转换允许在运行时检查和解释一个类实例的类型
3.取消初始化器允许一个类实例释放任何其所分配的资源
4.引用计数允许对一个类的多次引用
tips:结构体总是通过被复制的方式在代码中传递,因此请不要使用引用计数
3.大写开头
class SomeClass {
// class definition goes here
}
struct SomeStructure {
// structure definition goes here
}
4.感觉swift中的属性,就是通过var 直接去声明的方式来定义属性,只不过加了赋值语句而已
struct Resolution {
var width = 0
var heigth = 0
}
class VideoMode {
var resolution = Resolution() //类中的结构体居然也能作为类的属性
var interlaced = false
var frameRate = 0.0
var name: String?
}
5.发现没有根本就没有给属性声明类型,这个就利用了swift自动判别的功能
6.生成结构体和类实例的方式也非常简便
let someResolution = Resolution()
let someVideoMode = VideoMode()
7.访问和赋值都能直接用点语法去做,哇!
8.所有结构体都有一个自动生成的成员逐一初始化器,用于初始化新结构体实例中成员的属性。新实例中各个属性的初始值可以通过属性的名称传递到成员逐一初始化器之中
let vga = resolution(width:640, heigth: 480)
与结构体不同,类实例没有默认的成员逐一初始化器。
9. “等价于”表示两个类类型(class type)的常量或者变量引用同一个类实例,用===表示。
“等于”表示两个实例的值“相等”或“相同”,判定时要遵照类设计者定义定义的评判标准,因此相比于“相等”,这是一种更加合适的叫法,用==表示。
10.由于结构体是值类型,类事引用类型,所以在构建的时候我们必须考虑到底用那一种方式去构建
如有一下情况请使用结构体:
结构体的主要目的是用来封装少量相关简单数据量
有理由预计一个结构体实例在赋值或传递时,封装的数据将会被拷贝而不是被引用
任何在结构体中存储的值类型属性,也将会被拷贝,而不是被引用
结构体不需要去继承另一个已存在的类型的属性或者行为
11.数组的拷贝行为
在Swift 中,数组(Arrays)类型的赋值和拷贝行为要比字典(Dictionary)类型的复杂的多。当操作数组内容时,数组(Array)能提供接近C语言的的性能,并且拷贝行为只有在必要时才会发生。
如果你将一个数组(Array)实例赋给一个变量或常量,或者将其作为参数传递给函数或方法调用,在事件发生时数组的内容不会被拷贝。相反,数组公用相同的元素序列。当你在一个数组内修改某一元素,修改结果也会在另一数组显示
对数组来说,拷贝行为仅仅当操作有可能修改数组长度时才会发生。这种行为包括了附加(appending),插入(inserting),删除(removing)或者使用范围下标(ranged subscript)去替换这一范围内的元素。只有当数组拷贝确要发生时,数组内容的行为规则与字典中键值的相同
如果通过下标语法修改数组中某一元素的值,那么a,b,c中的相应值都会发生改变。请注意当你用下标语法修改某一值时,并没有拷贝行为伴随发生,因为下表语法修改值时没有改变数组长度的可能:
然而,当你给a附加新元素时,数组的长度会改变。 当附加元素这一事件发生时,Swift 会创建这个数组的一个拷贝。从此以后,a将会是原数组的一个独立拷贝。
12.确保数组的唯一性
有两种方式给我们选择:
1.在操作一个数组,或将其传递给函数以及方法调用之前是很有必要先确定这个数组是有一个唯一拷贝的。通过在数组变量上调用unshare方法来确定数组引用的唯一性。(当数组赋给常量时,不能调用unshare方法)
2.直接用copy函数,进行强制拷贝
但要区分的时unshare会根据你拷贝的数组是否唯一来觉得是否进行拷贝,而copy则不考虑任何东西直接进行拷贝
1.定义属性用于存储值
2.定义方法用于提供功能
3.定义下标用于通过下标语法访问值
4.定义初始化器用于生成初始化值
5.通过扩展以增加默认实现的功能
2.和结构体相比累还有如下特有的功能:
1.继承允许一个类继承另一个类的特征
2.类型转换允许在运行时检查和解释一个类实例的类型
3.取消初始化器允许一个类实例释放任何其所分配的资源
4.引用计数允许对一个类的多次引用
tips:结构体总是通过被复制的方式在代码中传递,因此请不要使用引用计数
3.大写开头
class SomeClass {
// class definition goes here
}
struct SomeStructure {
// structure definition goes here
}
4.感觉swift中的属性,就是通过var 直接去声明的方式来定义属性,只不过加了赋值语句而已
struct Resolution {
var width = 0
var heigth = 0
}
class VideoMode {
var resolution = Resolution() //类中的结构体居然也能作为类的属性
var interlaced = false
var frameRate = 0.0
var name: String?
}
5.发现没有根本就没有给属性声明类型,这个就利用了swift自动判别的功能
6.生成结构体和类实例的方式也非常简便
let someResolution = Resolution()
let someVideoMode = VideoMode()
7.访问和赋值都能直接用点语法去做,哇!
8.所有结构体都有一个自动生成的成员逐一初始化器,用于初始化新结构体实例中成员的属性。新实例中各个属性的初始值可以通过属性的名称传递到成员逐一初始化器之中
let vga = resolution(width:640, heigth: 480)
与结构体不同,类实例没有默认的成员逐一初始化器。
9. “等价于”表示两个类类型(class type)的常量或者变量引用同一个类实例,用===表示。
“等于”表示两个实例的值“相等”或“相同”,判定时要遵照类设计者定义定义的评判标准,因此相比于“相等”,这是一种更加合适的叫法,用==表示。
10.由于结构体是值类型,类事引用类型,所以在构建的时候我们必须考虑到底用那一种方式去构建
如有一下情况请使用结构体:
结构体的主要目的是用来封装少量相关简单数据量
有理由预计一个结构体实例在赋值或传递时,封装的数据将会被拷贝而不是被引用
任何在结构体中存储的值类型属性,也将会被拷贝,而不是被引用
结构体不需要去继承另一个已存在的类型的属性或者行为
11.数组的拷贝行为
在Swift 中,数组(Arrays)类型的赋值和拷贝行为要比字典(Dictionary)类型的复杂的多。当操作数组内容时,数组(Array)能提供接近C语言的的性能,并且拷贝行为只有在必要时才会发生。
如果你将一个数组(Array)实例赋给一个变量或常量,或者将其作为参数传递给函数或方法调用,在事件发生时数组的内容不会被拷贝。相反,数组公用相同的元素序列。当你在一个数组内修改某一元素,修改结果也会在另一数组显示
对数组来说,拷贝行为仅仅当操作有可能修改数组长度时才会发生。这种行为包括了附加(appending),插入(inserting),删除(removing)或者使用范围下标(ranged subscript)去替换这一范围内的元素。只有当数组拷贝确要发生时,数组内容的行为规则与字典中键值的相同
如果通过下标语法修改数组中某一元素的值,那么a,b,c中的相应值都会发生改变。请注意当你用下标语法修改某一值时,并没有拷贝行为伴随发生,因为下表语法修改值时没有改变数组长度的可能:
然而,当你给a附加新元素时,数组的长度会改变。 当附加元素这一事件发生时,Swift 会创建这个数组的一个拷贝。从此以后,a将会是原数组的一个独立拷贝。
12.确保数组的唯一性
有两种方式给我们选择:
1.在操作一个数组,或将其传递给函数以及方法调用之前是很有必要先确定这个数组是有一个唯一拷贝的。通过在数组变量上调用unshare方法来确定数组引用的唯一性。(当数组赋给常量时,不能调用unshare方法)
2.直接用copy函数,进行强制拷贝
但要区分的时unshare会根据你拷贝的数组是否唯一来觉得是否进行拷贝,而copy则不考虑任何东西直接进行拷贝