Swift类
在本教程中,我们将讨论基本的构建模块之一,即Swift类。
Swift类
Swift类是该类实例的蓝图或者模板。
术语"对象"通常用于指代类的实例。
传统上将类的实例称为对象。
但是,在Swift中,类和结构的功能比其他语言更接近。
因此,我们可以互换使用实例和对象这两个词。
Swift类语法
class A{ var str = "Hello, playground" var number = 1 }
创建该类的实例,如下所示。
var a = A() print(a.str) //prints "Hello, playground\n"
Swift类初始化器
与结构不同,类没有默认的初始化器。
我们需要创建自己的初始化程序,并将值分配给它们中的属性。
下面的代码段包含一个带有初始化程序的类。
class A{ var str : String var number : Int init(str: String, number: Int) { self.str = str self.number = number } } var a = A(str: "Hello World",number: 2) print("Default String is \(a.str) and Default number is \(a.number)") //prints "Default String is Hello World and Default number is 2\n"
注意:如果未在类中初始化任何声明的属性,则会发生编译器错误。
如下所示在类中声明多个初始化器。
class A{ var str : String var number : Int init(str: String, number: Int) { self.str = str self.number = number } init() { str = "Declare as many initalisers as you want" number = 0 } } var a = A(str: "Hello World",number: 2) print("Default String is \(a.str) and Default number is \(a.number)") var a1 = A() print("Default String is \(a1.str) and Default number is \(a1.number)") //prints "Default String is Declare as many initalisers as you want and Default number is 0\n"
Swift类继承
继承定义了一种关系,在该关系中可以根据超类定义子类。
类支持继承,而结构不支持。
任何不从另一个类继承的类都称为基类。
子类化是在现有类的基础上建立新类的行为。
子类从现有类继承特征,然后我们可以对其进行细化和添加新特征。
让我们创建一个基类,如下所示。
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)") } }
因此Animal是我们的子类将继承的基类。
在深入了解它们之前,让我们尝试创建上述类的实例并对其进行调用,如下所示。
var anim = Animal(isVeg: false, eats: "Can eat you", numberOfLegs: 4) anim.printProperties() //prints Is Veg? false. Eats: Can eat you. Number of legs: 4
为了在子类中扩展超类,我们编写了子类名称,后跟冒号,然后是超类名称,如下所示。
class Tiger: Animal { //Add class specific implementation }
无需在子类中进行任何设置,我们就可以使用超类的初始化程序创建Tiger类的实例。
要访问超类的属性和功能,请使用点运算符。
var tiger = Tiger(isVeg: false, eats: "Can eat you", numberOfLegs: 4) tiger.printProperties() //prints 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() //prints Is Veg? false. Eats: Can eat you. Number of legs: 4 This is Subclass Tiger
要访问类内部超类的属性/函数,我们使用" super"关键字,后跟点运算符。
如果Animal类中的函数printProperties设置为final,则该函数不能被覆盖,并会导致编译错误。
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 } final func printProperties() { print("Is Veg? \(isVeg). Eats: \(eats). Number of legs: \(numberOfLegs)") } } class Tiger: Animal { //The Below function can't be overridden. Would give compilation error. override func printProperties() { super.printProperties() print("This is Subclass Tiger") } }
在下面的代码中,我们将属性放置在子类中并创建其自己的" init"
class Tiger: Animal { var color : String init(isVeg: Bool, eats: String, numberOfLegs: Int, color: String) { self.color = color super.init(isVeg: isVeg, eats: eats, numberOfLegs: numberOfLegs) } override func printProperties() { print("Is Veg? \(isVeg). Eats: \(eats). Number of legs: \(numberOfLegs). Color is \(color).") } } var tiger = Tiger(isVeg: false, eats: "Can eat you", numberOfLegs: 4, color: "White") tiger.printProperties() //prints Is Veg? false. Eats: Can eat you. Number of legs: 4. Color is White.
在上面的代码中,我们向子类添加了另一个属性" color"。
一旦子类属性被初始化,就会调用" super.init"来初始化超类的属性。
Swift类是引用类型
与结构不同,类是通过引用而不是值传递的。
让我们将上述" tiger"实例设置为另一个变量,然后更改其属性。
var tiger = Tiger(isVeg: false, eats: "Can eat you", numberOfLegs: 4, color: "White") var tiger1 = tiger tiger1.color = "Yellow"
现在,下面给出了在tiger和tiger1实例上打印属性颜色的输出。
print(tiger1.color) //Yellow print(tiger.color) //Yellow
" tiger1"不是" tiger"的副本。
与tiger
相同。
方便初始值设定项(Convenience Initializers)
方便的初始值设定项充当类的主初始值设定项的支持初始值设定项。
这些主要用于在主初始化程序中设置默认值。
便利初始化器在" init"之前需要关键字" convenience",如下所示。
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
注意:只有在类中已经声明了普通初始值设定项时,方便初始值设定项才有效。方便初始值设定项必须从同一类中调用另一个初始值设定项。