Swift的类(附实例)

123 阅读2分钟

本教程属于Swift系列

类与结构有点类似,但它们有一些关键的区别。

一个类是用这种语法定义的。

class Dog {

}

在一个类里面,你可以定义存储的属性。

class Dog {
    var age = 0
}

一个类的定义定义了一个类型。要创建一个具有这种类型的新实例,我们使用这种语法。

let roger = Dog()

一旦你有了一个实例,你就可以使用点语法访问它的属性。

let roger = Dog()
roger.age

同样的点语法也被用来更新一个属性值。

roger.age = 9

一个很大的区别是,类是引用类型。结构(和枚举)是值类型。

这意味着,将一个类的实例分配给另一个变量并不能复制该实例。两个变量都指向同一个实例。

class Dog {
    var age = 0
}

let roger = Dog()
let syd = roger

roger.age = 9
//syd.age == 9

这也意味着我们可以使用let 来定义一个类的引用,并且我们可以改变它的属性,正如你在上面的例子中看到的那样。

我们可以创建类的实例,我们称它们为对象

与结构体一样,类可以有属性、方法等等。

与结构相反,我们必须定义一个初始化器,以便在创建实例时初始化其值。

class Dog {
    var age : Int
    
    init(age: Int) {
        self.age = age
    }
}

let roger = Dog(age: 9)

如果你有一个初始化器,你只能声明属性而不初始化它们。

请看self 的使用。我们需要它,因为age 既是一个实例属性,又是init(age:) 方法参数。self.age 引用了age 实例属性。

类可以有实例方法:属于一个类的实例的函数。

class Dog {
    var age = 8
    var name = "Roger"

    func bark() {
      print("\(name): wof!")
    }
}

我们也有类型方法

class Dog {
    var age = 8
    var name = "Roger"

    func bark() {
        print("\(name): wof!")
    }
    static func hello() {
        print("Hello I am the Dog struct")
    }
}

被调用为Dog.hello()

类允许的一件重要事情是继承。

一个类可以继承另一个类的所有属性和方法。

比如我们有一个类Animal 。每个动物都有一个年龄。

class Animal {
    var age: Int
}

不是每种动物都有一个名字。狗有一个名字。所以我们创建了一个Dog ,扩展自Animal

class Dog: Animal {
    var name: String
}

现在我们必须为这两个类添加一个初始化器。在狗的例子中,在我们做了具体的类的初始化之后,我们可以使用super.init() 来调用父类的初始化器。

class Animal {
    var age: Int
    
    init(age: Int) {
        self.age = age
    }
}

class Dog: Animal {
    var name: String
    
    init(age: Int, name: String) {
        self.name = name
        super.init(age: age)
    }
}

var horse = Animal(age: 8)
var roger = Dog(age: 8, name: "Roger")

Animal 现在是一个超类,而 是一个Dog 子类

关于类还有更多要说的,但这是一个很好的介绍。