Swift系列14-初始化

序言

初始化是为类,结构体,枚举准备实例的过程.
这个过程需要给实例里的每一个存储属性设置一个初始值,并且在新实例可以使用之前执行任何其他所必须的配置或者初始化.

通过初始化器来实现这个初始化过程,它更像是一个用来创建特定新实例特殊的方法.
不同于OC的初始化,Swift初始化不需要返回值.这些初始化器主要的角色是保证第一次使用之前某类型的新实例能够正确的初始化.

类实例的初始化有一个反初始化器,它会在这个类的实例被释放之前执行任意的自定义清理.

初始化

初始化属性赋值

初始化给存储属性设置初始值

1
2
3
4
5
6
7
8
9
10
11
12
13
//初始化为name属性设置初始化值
class People: NSObject {
var name:String?
override init() {
name = "gc"
}
}
class BaseMessage: NSObject {
override init() {
let p = People.init()
print(p.name!)
}
}

自定义初始化

初始化参数:
形式参数名 _ a:String
实参参数名 b:String

1
2
3
4
5
6
7
8
9
10
11
class Monday: NSObject {
init(_ a:String,b:String) {
print("\(a) \(b)")
}
}
class BaseMessage: NSObject {
override init() {
let m = Monday.init("1", b: "2")
print(m)
}
}

默认初始化器

创建一个实例

1
let u = UIView()

结构体类型的初始化

1
2
3
4
5
struct Tree {
var tail:CGFloat,width:CGFloat
}
let t1 = Tree.init(tail: 10.1, width: 2.1)
print(t1.tail,t1.width)

类的继承和初始化

主要的init()

1
let v2 = UIView.init()

便利构造器

convenience,在必要的时候给类提供,次要的辅助型的

1
2
3
4
5
class CountDownView: UIView {
convenience init(_ name:String) {
self.init(frame: CGRect.zero)//必须要实现父类的初始化
}
}

可失败的构造器:init?

没有传值或者传值不对的时候,会导致初始化失败

1
2
3
4
5
6
7
8
9
10
11
struct Animal {
let species: String
init?(species: String) {
if species.isEmpty { return nil }
self.species = species
}
}
let anonymousCreature = Animal(species: "")
if anonymousCreature == nil {
print("初始化失败")
}

required 必要初始化器

当父类初始化用required关键字修饰时,子类必须要要实现它

1
2
3
4
5
6
7
8
class BookBaseView: UIView {
override init(frame: CGRect) {
super.init(frame: frame)
}
required init?(coder: NSCoder) {
fatalError("init(coder:) has not been implemented")
}
}

The End