一、类和结构体的初始化
不论是用OC,还是swift开发,我们之前用的更多的是类,结构体很少用,我们先来看一下类和结构体的区别:
class LGTeacher{
var age: Int
var name: String
init(age: Int, name: String) {
self.age = age
self.name = name
}
}
struct LGTeacher{
var age: Int
var name: String
init(age: Int, name: String) {
self.age = age
self.name = name
}
}
从上面的代码来看,类和结构体在初始化时,很相似,那他们有什么相同点和区别呢?
类与结构体相同点
- 定义存储值的属性
- 定义方法
- 定义下标以使用下标语法提供对其值的访问
- 定义初始化器
- 使用 extension 来拓展功能
- 遵循协议来提供某种功能
类与结构体不同点
- 类有继承的特性,而结构体没有
- 在 Swift 中,类是引用类型,结构体是值类型。值类型在传递和赋值时将进行复制,而引用类型则只会使用引用对象的一个"指向"。
- 类有析构函数(deinit)用来释放其分配的资源
- 引用计数允许对一个类实例有多个引用
- 在内存中,引用类型诸如类是在堆上,而值类型诸如结构体是在栈上进行存储和操作。相比于栈上的操作,堆上的操作更加复杂耗时,所以一些官方推荐使用结构体,这样可以提高程序运行的效率。
如果没有其他额外的需求,只是用作存储数据,那么我们应该优先选择结构体,因为结构体在大量的创建性能优化上是比class优异的多,因为class需要去维护堆内存的创建,销毁,寻找,引用关系的创建等等,十分消耗性能
初始化:
结构体
struct LGTeacher{
var age: Int
var name: String
//结构体会默认的给我们生成初始化器
// init(age: Int, name: String) {
// self.age = age
// self.name = name
// }
}
var t = LGTeacher.init(age: 18, name: "小明")
类
class LGTeacher{
var age: Int
var name: String
//类必须我们手动创建初始化方法,不然会报错
init(_ age: Int,_ name: String) {
self.age = age
self.name = name
}
init(Age age: Int,Name name: String) {
self.age = age
self.name = name
}
//便捷初始化器
convenience init()
{
//需要调用当前类中的另一个初始化器
self.init(18, "李老师")
}
}
var t = LGTeacher.init(18, "小明")
var t1 = LGTeacher.init(Age: 18, Name: "小明")
var t12 = LGTeacher()
类的继承注意点
class Person{
var age: Int
var name: String
init(_ age: Int,_ name: String) {
self.age = age
self.name = name
}
}
class LGTeacher:Person{
//子类中的属性不能和父类的相同
var sex:Bool
init(_ age: Int,_ name: String,_ sex:Bool) {
//新添加的属性,需要在调用分类方法前先赋值
self.sex = sex
super.init(age, name)
//子类继承与父类的属性赋值前要先初始化父类
self.age = age
self.name = name
}
}
var t = LGTeacher.init(18, "小明", true)
二.类的生命周期
iOS开发的语言不管是OC还是Swift后端都是通过LLVM进行编译的,OC 通过 clang 编译器,编译成 IR,然后再生成可执行文件 .o(这里也就是我们的机器码) Swift 则是通过 Swift 编译器编译成 IR,然后在生成可执行文件。如下图所示: