Class
和Struct
类似,但是类可以继承其他类,并且类可以定义属性和方法。
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!")
}
}
Swift
提供关键词final
来防止类被继承。
fina class Dog {
func bark() {
print("Woof!")
}
}
与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"
}
Class
和Struct
是相似的,都可以使用属性和方法创建。final
来防止类被继承。