Menu
CoddyTech

静态成员

本课属于 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.0

static 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)" } // 静态方法读取静态属性
}
challenge icon

挑战

简单

完成 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))
quiz icon自我测试

这节课包含一个小测验。开始学习即可作答,并记录你的进度。

面向对象编程中的所有课

自己练习: Swift 在线编辑器