Menu
CoddyTech

方法与 self

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

在方法内部,self 是调用该方法的实例。self.count 和 count 表示同一个属性,所以通常会省略 self:

class Counter {
    var count = 0
    func increment() {
        self.count += 1
    }
}

let c = Counter()
c.increment()
print(c.count)

输出:

1

当参数和属性同名时,需要使用 self。此时,单独的名称表示参数,self.name 表示属性:

class Player {
    var name = "unknown"
    func rename(name: String) {
        self.name = name
    }
}

let p = Player()
p.rename(name: "Ada")
print(p.name)

输出:

Ada

方法可以调用同一个实例的其他方法,这样每个方法就能保持简短:

class Cart {
    var total = 0
    func add(_ price: Int) {
        total += price
    }
    func addTwice(_ price: Int) {
        add(price)
        add(price)
    }
}

let cart = Cart()
cart.addTwice(5)
print(cart.total)

输出:

10

方法也可以返回根据属性计算出的值。这里,isEmpty()会回答一个关于实例的问题,但不会改变实例:

class Cart {
    var items: [String] = []
    func add(_ item: String) {
        items.append(item)
    }
    func isEmpty() -> Bool {
        items.count == 0
    }
}

let cart = Cart()
print(cart.isEmpty())
cart.add("tea")
print(cart.isEmpty())

输出:

true
false
challenge icon

挑战

简单

完成 Thermostat 类。setTarget(target:) 将参数存储到属性 target 中(使用 self),warmer() 将目标值增加 1,display() 返回 target: 21。

提供的代码会读取一个起始目标值和一组命令(warmer 或 set <n>),执行这些命令,并在最后输出 display()。

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

亲手试试

// 提供的输入/输出代码:保持原样。
var input: [String] = []
while let line = readLine() { input.append(line) }
let t = Thermostat()
t.setTarget(target: Int(input[0])!)
for cmd in input.dropFirst() {
    if cmd == "warmer" { t.warmer() } else { t.setTarget(target: Int(cmd.dropFirst(4))!) }
}
print(t.display())
quiz icon自我测试

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

面向对象编程中的所有课

自己练习: Swift 在线编辑器