静态成员
本课属于 Coddy Swift 学习旅程的“面向对象编程”单元。第 14 课,共 57 课。
static 属性属于类型本身,而不属于任何实例。它只有一份副本,通过类型名称读取:
struct Temperature {
static let freezing = 0.0
static let boiling = 100.0
var celsius: Double
}
print(Temperature.boiling - Temperature.freezing)输出:
100.0static var 可以改变,因此适合存储所有实例共享的数据,例如记录已创建实例数量的计数器:
class Ticket {
static var issued = 0
let number: Int
init() {
Ticket.issued += 1
number = Ticket.issued
}
}
let a = Ticket()
let b = Ticket()
print(a.number)
print(b.number)
print(Ticket.issued)输出:
1
2
2在类型上调用 static func。它没有可供使用的 self 实例,因此只会使用它的参数和其他静态成员。它适合用来定义辅助函数,以及创建实例的具名方式:
struct Color {
var red: Int
var green: Int
var blue: Int
static func gray(_ level: Int) -> Color {
Color(red: level, green: level, blue: level)
}
}
let c = Color.gray(128)
print(c.red + c.green + c.blue)输出:
384在类型内部,Self 是该类型的另一种名称,因此可以写成 Self.issued 来表示静态成员。实例方法可以读取静态成员,但静态方法不能读取实例属性,因为它不是在实例上调用的。
struct Level {
static let maximum = 10
var current = 1
func isMax() -> Bool { current == Self.maximum } // 实例读取静态属性
static func describe() -> String { "levels 1-\(maximum)" } // 静态方法读取静态属性
}挑战
简单完成 Order 类。静态属性 nextId 从 1 开始,每个新订单都将当前的 nextId 作为自己的 id,然后递增它。静态常量 taxPercent 的值为 10。实例方法 total() 返回小计加上税额(向下取整),静态方法 summary(of:) 接收一个订单数组,并返回 3 orders, 660 total。
提供的代码会读取每行一个小计,为每个小计创建一个订单,为每个订单打印 #1: 110,最后打印汇总信息。
你的代码应写在 Order.swift 中。main.swift 中包含提供的输入/输出代码,不能编辑。
亲手试试
// 提供的输入和输出代码:保持原样。
var input: [String] = []
while let line = readLine() { input.append(line) }
var orders: [Order] = []
for line in input {
let order = Order(subtotal: Int(line)!)
orders.append(order)
print("#\(order.id): \(order.total())")
}
print(Order.summary(of: orders))
这节课包含一个小测验。开始学习即可作答,并记录你的进度。
面向对象编程中的所有课
自己练习: Swift 在线编辑器