Published 2022-03-21

Classes - 类

创建类

ClassStruct类似,但是类可以继承其他类,并且类可以定义属性和方法。

class Dog {
    var name: String
    var breed: String

    init(name: String, breed: String) {
        self.name = name
        self.breed = breed
    }

    func bark() {
        print("Woof!")
    }
}

#创建实例
let poppy = Dog(name: "Poppy", breed: "Poodle")

类继承

Struct不同的是,Class可以继承其他类。

class Poodle: Dog {
    init(name: String) {
        super.init(name: name, breed: "Poodle")
    }
}

super.init(name: name, breed: "Poodle") // 调用父类的构造器

方法重写

类创建的实例可以重写父类的方法。

class Dog {
    func bark() {
        print("Woof!")
    }
}

let poppy = Dog()
poppy.bark()

# 类继承重写方法
class Poodle: Dog {
    override func bark() {
        print("Yip!")
    }
}

final 类

Swift提供关键词final来防止类被继承。

fina class Dog {
    func bark() {
        print("Woof!")
    }
}

复制 objects

Struct不同的是,Class可以被复制。

class Dog {
    var name: String
    var breed: String

    init(name: String, breed: String) {
        self.name = name
        self.breed = breed
    }

    func bark() {
        print("Woof!")
    }
}
var poppy = Dog(name: "Poppy", breed: "Poodle")
var poppyCopy = poppy
poppyCopy.name = "Poppy Copy"

反初始化

Struct不同的是,Class可以被反初始化。

class Person {
    var name: String

    init(name: String) {
        self.name = name
    }

    func sayHello() {
        print("Hello, \(name)!")
    }
}

在循环中创建实例,可以使用deinit来定义反初始化方法。

for _ in 1...10 {
    let person = Person(name: "John")
    person.sayHello()
}

deinit {
    print("Goodbye, \(name)!")
}

可变性

类与结构在常量的处理方式上有所不同。如果一个类或结构体的实例被声明为常量,则该实例的所有属性也必须是常量。

class Person {
    var name = "Taylor Swift"
}
let person = Person()
person.name = "Justin Bieber"
print(person.name) // Justin Bieber

# 如果将类或结构体实例设置为常量,则不能修改实例的属性。
class Person {
    let name = "Taylor Swift"
}

总结