Menu
CoddyTech

类是引用类型

本课属于 Coddy Swift 学习旅程的“面向对象编程”单元。第 5 课,共 57 课。

类是引用类型:变量保存的是对象的引用,而不是对象的副本。将一个实例赋给另一个变量,会为同一个对象创建第二个名称:

class Wallet {
    var coins = 10
}

let mine = Wallet()
let alias = mine
alias.coins = 25
print(mine.coins)

输出:

25

=== 用于检查两个引用是否指向同一个实例。即使两个独立的实例的所有属性都相同,它们仍然是不同的对象:

class Wallet {
    var coins = 10
}

let a = Wallet()
let b = a
let c = Wallet()
print(a === b)
print(a === c)

输出:

true
false

接收实例的函数会操作调用方的对象,因此在函数内部所做的更改之后仍然可见:

class Wallet {
    var coins = 10
}

func payFee(_ wallet: Wallet) {
    wallet.coins -= 3
}

let w = Wallet()
payFee(w)
payFee(w)
print(w.coins)

输出:

4

let 固定的是引用,而不是对象。持有类实例的常量不能指向另一个实例,但实例的 var 属性仍然可以更改。实例数组也持有引用:

class Wallet {
    var coins = 10
}

let shared = Wallet()
let team = [shared, shared]
team[0].coins = 99
print(shared.coins)
print(team[1].coins)

输出:

99
99
challenge icon

挑战

简单

一个团队共用一个 Budget。完成 spend(_:amount:),这是一个接收预算并仅在剩余金额足够时扣除相应金额的函数;如果允许支出,则返回 true。然后完成 runTeam(start:purchases:):创建一个预算,让每笔购买都从同一个预算中扣款,并为每笔购买返回一行(ok 30 或 denied 80),最后追加 left 20。

提供的代码会读取起始预算和以逗号分隔的一行购买金额,并打印返回的每一行。

你的代码写在 Budget.swift 和 Functions.swift 中。main.swift 中包含提供的输入/输出代码,不能编辑。

亲手试试

// 提供的输入/输出代码:保持原样。
var input: [String] = []
while let line = readLine() { input.append(line) }
let purchases = input[1].split(separator: ",").map { Int($0)! }
for line in runTeam(start: Int(input[0])!, purchases: purchases) { print(line) }
quiz icon自我测试

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

面向对象编程中的所有课

自己练习: Swift 在线编辑器