Swift學習-Class
阿新 • • 發佈:2021-06-29
1.宣告Class
class A{
var str = "Hello, Class"
var number = 1
}
//建立類的例項
var a = A()
print(a.str)
//列印結果:Hello, Class
2.類與結構體不同,類沒有預設初始化方法。我們需要在類內部自己定義初始化方法傳參。
結構體可以直接寫為:
var a = A(str:"test",number:10)
但是用同樣方法寫類的時候是會報錯的,如果不自定義初始化方法,只能使用空初始化:
var a = A()
自定義初始化方法
class B{ var str = "Hello, Class" var number = 1 init(str: String,number: Int){ self.str = str self.number = number } //無參初始化,委託初始化方法 // convenience init(){ // self.init(str: "Hello, Class",number: 1) // } //或者這樣定義也可以 init() { str = "Declare as many initalisers as you want" number = 0 } } var b = B(str: "Hello this is B", number: 2) print("Default String is \(b.str) and Default number is \(b.number)") //列印結果:Default String is Hello this is B and Default number is 2
如果自定義了初始化方法,此時申明空初始化會報錯;
提示:Missing arguments for parameters 'str', 'number' in call
此時,我們可以在類中宣告一個代理依託,宣告一個無參初始化。此時就不報錯了。
3.類繼承:類支援繼承,結構體不支援
子類繼承父類的特徵,然後可以對其進行優化,並新增新的特徵
class Animal{ var isVeg : Bool var eats : String var numberOfLegs : Int init(isVeg: Bool, eats: String, numberOfLegs: Int) { self.isVeg = isVeg self.eats = eats self.numberOfLegs = numberOfLegs } func printProperties(){ print("Is Veg? \(isVeg). Eats:\(eats). Number of legs:\(numberOfLegs)") } } var anim = Animal(isVeg: false, eats: "Can eat you", numberOfLegs: 4) anim.printProperties() //列印結果:Is Veg? false. Eats:Can eat you. Number of legs:4
建立子類
class Tiger : Animal{
//Add class specific implementaion
}
var tiger = Tiger(isVeg: false, eats: "Can eat you", numberOfLegs: 4)
tiger.printProperties()
//列印結果:Is Veg? false. Eats:Can eat you. Number of legs:4
需要重寫父類中的函式時,需要用override修飾函式名
class Tiger : Animal{ override func printProperties() { super.printProperties() print("This is Subclass Tiger") } } var tiger = Tiger(isVeg: false, eats: "Can eat you", numberOfLegs: 4) tiger.printProperties() //列印結果: //Is Veg? false. Eats:Can eat you. Number of legs:4 //This is Subclass Tiger
下面例子是在子類中新增新屬性
class Tiger : Animal{
var color : String
override func printProperties() {
//呼叫父類這個方法,會多列印一個結果,所以在重寫父類方法時,也可以不加這個
// super.printProperties()
print("This is tiger Is Veg \(isVeg). Eats:\(eats). Number of legs:\(numberOfLegs).color \(color)")
}
init(isVeg: Bool, eats: String, numberOfLegs: Int,color:String) {
self.color = color
//如果想要在子類中引用父類的屬性或函式,使用super.呼叫
super.init(isVeg: isVeg, eats: eats, numberOfLegs: numberOfLegs)
}
}
var tiger = Tiger(isVeg: false, eats: "Can eat you", numberOfLegs: 4,color: "yellow")
tiger.printProperties()
//列印結果:This is tiger Is Veg false. Eats:Can eat you. Number of legs:4.color yellow
類與結構體的另一個區別就是:類是引用型別的,結構體是值型別
var tiger = Tiger(isVeg: false, eats: "Can eat you", numberOfLegs: 4, color: "White")
tiger.printProperties()
//列印結果:This is tiger Is Veg false. Eats:Can eat you. Number of legs:4.color White
/ar tiger1 = tiger
tiger1.color = "Yellow"
tiger1.printProperties()//列印結果:This is tiger Is Veg false. Eats:Can eat you. Number of legs:4.color Yellow
tiger.printProperties()//列印結果:This is tiger Is Veg false. Eats:Can eat you. Number of legs:4.color Yellow
tiger.eats = "they can eat everything"
tiger1.printProperties()
tiger.printProperties()
//列印結果:This is tiger Is Veg false. Eats:they can eat everything. Number of legs:4.color Yellow
//列印結果:This is tiger Is Veg false. Eats:they can eat everything. Number of legs:4.color Yellow
4.便利初始化:設定屬性值的初始值
class A {
var eyes: Int
var legs: Int
init(eyes: Int, legs: Int) {
self.eyes = eyes
self.legs = legs
}
convenience init() {
self.init(eyes: 2, legs: 4)
}
}
var a = A()
print(a.eyes) //prints 2
print(a.legs) //prints 4
便利初始化,只有當類中已經聲明瞭init()時,才可以定義