很久不寫swift了嘹屯,回頭再想拿它寫App時發(fā)現(xiàn)攻询,忘了。州弟。钧栖。。婆翔。
那就從頭再來拯杠,邊學(xué)邊寫寫筆記,供自己擠地鐵的時候看一眼~
因為臭毛病啃奴,上來開始就是class潭陪,然后按照我在oc里留下的習(xí)慣,接著寫初始化方法最蕾,然后就怎么寫都不對畔咧,是要搞什么鬼,就是個初始化呀揖膜!
正文:
swift里所有的class初始化規(guī)則:
舉例:
1.當(dāng)前class為基類誓沸,所有屬性都有默認值時,可以有類的初始化方法壹粟,也可以不實現(xiàn)類的初始化方法拜隧。當(dāng)不實現(xiàn)類的初始化方法時,編譯器會為類提供默認的初始化方法趁仙,構(gòu)造生成的實例的每個屬性的值都為默認值洪添。
class Person {
var name :String?
var age :Int=0
}
此種情況下也可以為類實現(xiàn)初始化方法。(下文中構(gòu)造方法即初始化方法)
當(dāng)不指定默認值時雀费,類必須實現(xiàn)指定構(gòu)造方法(designed)
class Person {
var name : String
var age : Int
init () {
name = ""
age = 0
}
}
2.當(dāng)class有父類時干奢,指定構(gòu)造器必須調(diào)用其直接父類的的指定構(gòu)造器
class Person : NSObject {
var name : String
var age : Int
init (name:String) {
self.name = name
self.age = 0
super.init();
}
}
子類也可以復(fù)寫父類的designed構(gòu)造方法
class Person : NSObject {
var name : String
var age : Int
override init () {
self.name = ""
self.age = 0
super.init()
}
}
但是調(diào)用父類的designed的方法之前,必需要初始化子類所有屬性的值
3.當(dāng)子類有convenience構(gòu)造方法時盏袄,convenience構(gòu)造方法必需要調(diào)用designed構(gòu)造方法
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)
}
}
總結(jié):
1. 每個class 保證至少有一個初始化方法忿峻,可以是默認的,也可以是designed的
2.保證初始化完成后辕羽,每個property都有一個初始值逛尚,無論是定義時聲明的,還是初始化時賦值的刁愿。
3. 如果class有繼承關(guān)系绰寞,當(dāng)子類class不實現(xiàn)構(gòu)造方法時,子類將自動從父類class繼承初始化方法。
4.當(dāng)class的所有屬性滤钱,在定義時顯示或隱式的給出了默認值觉壶,那么當(dāng)不寫當(dāng)前類的初始化方法,編譯器會為該類生成默認的初始化方法件缸。如果铜靶,屬性定義時部分未給出默認值,也不實現(xiàn)類的構(gòu)造方法停团,則編譯報錯。
5.class的初始化方法掏熬,分為designed和convenience兩種佑稠,designed初始化方法,是類的完整構(gòu)造方法旗芬,也可以說是基礎(chǔ)構(gòu)造方法舌胶,需要保證類的所有屬性都具備初始值。convenience構(gòu)造方法是類的便捷構(gòu)造方法疮丛,提供某些初始化完成后的特色操作幔嫂,根據(jù)需求,對類做一些特殊處理誊薄。convenience初始化方法必須要調(diào)用designed初始化方法履恩。