类和结构体有很多相似的地方:
定义属性用于存储值
定义方法用于提供功能
定义附属脚本用于访问值
定义构造器用于生成初始化值
通过扩展以增加默认实现的功能
实现协议以实现某种标准功能
跟结构体相比,类还有如下的功能:继承允许一个类继承另一类的特征
类型转换允许在运行时检查和解释一个类实例的类型
解释器允许一个类实例释放任何其所被分配的资源
引用计数允许对一个类的多次引用
这几个概念我都不是很熟悉,下面会有章节讲到这些概念,对于上面接触过java上面提供的相同点还是有点清楚的,等下面看了后面的章节再回过头来看。
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()
print("The width of someVideoMode is \(someVideoMode.resolution.width)")
上面的代码定义了一个结构体Resolution,里面包含两个变量一个width,一个height。
然后定义个一个类VideoMode,包含了四个变量属性,第一个resolution,它初始化为一个Resolution结构体的实例,属性被推断成Resolution,这个类还会初始化其他三个属性,name被初始化成一个可选String的name,name会自动被赋值成默认值nil。
最后将类和结构体实例化。后来通过dot syntax来访问属性。
结构体类型的成员逐一构造器(Memberwise Initializers for Structure Type)
所有结构体都有一个自动生成的成员逐一构造器,用于初始化新结构体实例中成员的属性。新实例中各个属性的初始化可以通过属性的名称传递到成员逐一构造器中
let vga = Resolution(width: 640, height: 480)
这个跟类不同,类是没有默认的成员逐一构造器的。
结构体和枚举是值类型
值类型被赋予给一个变量、常量或者被传递给一个函数的时候,其值会被拷贝。
在swift中,所有的基本类型:整数(Integer)、浮点数(floating-point)、布尔值(Boolean)、字符串(string)、数组(array)、字典(dictionary)都是值类型,并且在底层都是以结构体的形式来实现的。
let hd = Resolution(width: 1920, height: 1080)
var cinema = hd
let hd = Resolution(width: 1920, height: 1080)
var cinema = hd
cinema.width = 2048
hd //{width 1920, height 1080}
cinema //{width 2048, height 1080
可以看见women对cinema的with进行修改的十后hd的width并没有变化,也就是说,我们将hd赋值给cinema赋值的时候,实际上是将hd中存在的值进行拷贝,将拷贝的数据存储到cinema实例中,cinema中的数据的修改对hd中的数据是没有影响的,这是两份数据。
枚举也遵循相同的行为准则:
enum CompassPoint {
case North,South,East,West
}
var currentDirection = CompassPoint.West
let rememberDirection = currentDirection
currentDirection = .East
if rememberDirection == .West {
print("The remebered direction is still .West")
}
我们有一个枚举类型的变量CompassPoint,currentDirection被赋值.West,然后传递给rememberDirection,再把currentDirection修改成.East,但是这个修改对rememberDirection是没有影响的,它还是原来的.West ,所以还是输出“The remebered direction is still .West”