很久不写swift了,回头再想拿它写App时发现,忘了。。。。。
那就从头再来,边学边写写笔记,供自己挤地铁的时候看一眼~
因为臭毛病,上来开始就是class,然后按照我在oc里留下的习惯,接着写初始化方法,然后就怎么写都不对,是要搞什么鬼,就是个初始化呀!
正文:
swift里所有的class初始化规则:
举例:
1.当前class为基类,所有属性都有默认值时,可以有类的初始化方法,也可以不实现类的初始化方法。当不实现类的初始化方法时,编译器会为类提供默认的初始化方法,构造生成的实例的每个属性的值都为默认值。
class Person {
var name :String?
var age :Int=0
}
此种情况下也可以为类实现初始化方法。(下文中构造方法即初始化方法)
当不指定默认值时,类必须实现指定构造方法(designed)
class Person {
var name : String
var age : Int
init () {
name = ""
age = 0
}
}
2.当class有父类时,指定构造器必须调用其直接父类的的指定构造器
class Person : NSObject {
var name : String
var age : Int
init (name:String) {
self.name = name
self.age = 0
super.init();
}
}
子类也可以复写父类的designed构造方法
class Person : NSObject {
var name : String
var age : Int
override init () {
self.name = ""
self.age = 0
super.init()
}
}
但是调用父类的designed的方法之前,必需要初始化子类所有属性的值
3.当子类有convenience构造方法时,convenience构造方法必需要调用designed构造方法
class Person : NSObject {
var name : String
var age : Int
init(name:String, age:Int) {
self.name = name;
self.age = age;
super.init()
}
convenience init (name:String) {
self.init(name:name,age:0);
}
convenience init(age:Int) {
self.init(name: "Mingming",age:age)
}
}
总结:
1. 每个class 保证至少有一个初始化方法,可以是默认的,也可以是designed的
2.保证初始化完成后,每个property都有一个初始值,无论是定义时声明的,还是初始化时赋值的。
3. 如果class有继承关系,当子类class不实现构造方法时,子类将自动从父类class继承初始化方法。
4.当class的所有属性,在定义时显示或隐式的给出了默认值,那么当不写当前类的初始化方法,编译器会为该类生成默认的初始化方法。如果,属性定义时部分未给出默认值,也不实现类的构造方法,则编译报错。
5.class的初始化方法,分为designed和convenience两种,designed初始化方法,是类的完整构造方法,也可以说是基础构造方法,需要保证类的所有属性都具备初始值。convenience构造方法是类的便捷构造方法,提供某些初始化完成后的特色操作,根据需求,对类做一些特殊处理。convenience初始化方法必须要调用designed初始化方法。