本教程属于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 子类。
关于类还有更多要说的,但这是一个很好的介绍。