结构体
关键字struct
struct Date {
var year: Int
var month: Int
var day: Int
}
// 创建。可以传入所有成员值,用以初始化所有成员
var date = Date(year: 2019, month: 06, day: 29)
在 Swift 标准库中,比如
Bool、Int、Double、 String、Array、Dictionary
等常见类型都是结构体。
- 初始化器
所有的结构体都有一个编译器自动生成的初始化器(initializer)
,包括初始化方法、构造器、构造方法。可以理解为init
方法。
如果给属性设置 可选变量,则会自动生成多个初始化器。
struct Point {
var x: Int?
var y: Int?
}
// 创建。
var p1 = Point(x: 10, y: 10)
var p2 = Point(y: 10)
var p3 = Point(x: 10)
var p4 = Point()
类
关键字class
class Point {
var x: Int = 0
var y: Int = 0
}
// 创建
var point = Point()
- 类的 初始化器
类的定义和结构体类似,但编译器并没有为类 自动生成初始化器!!
如果类的所有成员 都在定义时初始化了,编译器会为类生成无参的初始化器。
结构体与类对比
struct Resolution {
var width = 0
var height = 0
}
class VideoMode {
var resolution = Resolution()
var interlaced = false
var frameRate = 0.0
var name: String?
}
Swift 中,结构体和类有很多共同点:
- 定义属性用于存储值
- 定义方法用于提供功能
- 定义下标操作用于通过下标语法访问它们的值
- 定义构造器用于设置初始值
- 通过扩展以增加默认实现之外的功能
- 遵循协议以提供某种标准功能
与结构体相比,类还有如下的附加功能:
- 继承
允许一个类继承另一个类的特征 - 类型转换
允许在运行时检查和解释一个类实例的类型 - 析构器
允许一个类实例释放任何其所被分配的资源 - 引用计数
允许对一个类的多次引用
类支持的附加功能是以增加复杂性为代价的。一般优先使用结构体,因为它们更容易理解,仅在适当或必要时才使用类。实际上,大多数自定义数据类型都会是结构体和枚举。
本质区别
结构体是值类型,类是引用类型(指针类型)
-
值类型
Swift 中所有的结构体、枚举类型都是值类型。当它被赋值给一个变量、常量或者被传递给一个函数的时候,其内容会被拷贝。相当于“深拷贝”,两者相互独立。 -
引用类型
在被赋予到一个变量、常量或者被传递到一个函数时,其值不会被拷贝。因此,使用的是已存在实例的引用,而不是其拷贝。相当于“浅拷贝”。
因为类是引用类型,所以多个常量和变量可能在幕后同时引用同一个类实例。判定两个常量或者变量,是否引用同一个类实例,Swift 提供了两个恒等运算符:相同
===
、不相同!==
由于结构体属于值类型。当值类型的实例被声明为常量的时候,它的所有属性也就成了常量。属于引用类型的类则不一样。把一个引用类型的实例赋给一个常量后,依然可以修改该实例的可变属性。
结构体和类的实例
创建了一个自定义的类型或者结构体,你需要创建与之对应的一个实例。结构体和类都使用 构造器语法 来创建新的实例。构造器语法的最简单形式是在结构体或者类的类型名称后跟随一对空括号,如:
let someResolution = Resolution()
let someVideoMode = VideoMode()
通过这种方式所创建的类或者结构体实例,其属性均会被初始化为默认值。
网友评论