一、结构体
结构体是把相关数据块组合在一起放在内存中的一种类型。当需要把数据组合为一种通用类型时就可以用结构体。
import Foundation
struct Town {
var population = 5435
var numberOfStoplights = 4
}
var myTown = Town()
print("Population: (myTown.pupulation), number of stoplights: (myTown.numberOfStoplights)")
二、实例方法和mutating方法
struct Town {
var population = 5422
var numberOfStoplights = 4
func printDescription() {
print("Population: \(myTown.pupulation), number of stoplights: \(myTown.numberOfStoplights)")
}
}
var myTown = Town()
myTown.printDescription()。
与枚举类似,如果结构体的一个实例方法要修改结构体的属性,就需要标记为mutating方法。
struct Town {
var population = 5422
var numberOfStoplights = 4
func printDescription() {
print("Population: \(myTown.pupulation), number of stoplights: \(myTown.numberOfStoplights)")
mutating func changePopulation(by amount: Int) {
population += amount
}
}
}
三、类
与结构体类似,类可以用来为抽象成一个通用类型的相关数据建模。
class Monster {
var town: Town?
var name = "Monster"
func terrorizeTown(){
if town != nil {
print("\(name) is terrorizing a town!")
} else{
print("\(name) has't found a town to rerroriz yet")
}
}
}
继承。重写与禁止重写。
override, final override。
四、类型方法
除了前面定义的供实例调用的实例方法,还可以定义对类型本身进行调用的方法,即类型方法。
如结构体类型方法。
struct Square {
static func numberOfSides() -> {
return 4
}
}
对于结构体等值类型,声明类型方法需要用到static关键字。作为对比,类的类型方法要用class关键字标记。
class Zombie: Monster {
class func makeSpookyNoise() -> String {
return "Brains..."
}
...
}
调用:
let sides = Square.numberOfSides()
let spookyNoise = Zombie.makeSpookyNoise()
子类覆盖父类的类型方法需要用到override, 禁止覆盖用static或final。