Swift类

时间:2020-02-23 14:44:00  来源:igfitidea点击:

在本教程中,我们将讨论基本的构建模块之一,即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

注意:只有在类中已经声明了普通初始值设定项时,方便初始值设定项才有效。方便初始值设定项必须从同一类中调用另一个初始值设定项。