Menu
CoddyTech

Phương thức và self

Thuộc phần Lập trình hướng đối tượng trong hành trình Swift của Coddy. Bài học 3 trên 57.

Bên trong một phương thức, self là đối tượng được gọi phương thức đó. self.count và count có nghĩa là cùng một thuộc tính, vì vậy thường có thể lược bỏ self:

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

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

Đầu ra:

1

self cần thiết khi tham số có cùng tên với thuộc tính. Khi đó, tên thông thường chỉ tham số, còn self.name chỉ thuộc tính:

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

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

Đầu ra:

Ada

Các phương thức có thể gọi những phương thức khác của cùng một đối tượng, nhờ đó mỗi phương thức luôn ngắn gọn:

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)

Đầu ra:

10

Một phương thức cũng có thể trả về giá trị được tính từ các thuộc tính. Ở đây, isEmpty() trả lời một câu hỏi về instance mà không thay đổi nó:

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())

Đầu ra:

true
false
challenge icon

Thử thách

Dễ

Hoàn thiện lớp Thermostat. setTarget(target:) lưu tham số vào thuộc tính target (dùng self), warmer() tăng giá trị mục tiêu thêm 1 và display() trả về target: 21.

Code được cung cấp đọc giá trị mục tiêu ban đầu và danh sách lệnh (warmer hoặc set <n>), áp dụng chúng rồi in ra display() ở cuối.

Viết code của bạn trong Thermostat.swift. main.swift chứa code đầu vào/đầu ra được cung cấp và bạn không thể chỉnh sửa tệp này.

Tự làm thử

// Đoạn code đầu vào/đầu ra đã cho: giữ nguyên
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 iconTự kiểm tra

Bài học này có một bài trắc nghiệm ngắn. Bắt đầu bài học để trả lời và theo dõi tiến độ.

Tất cả bài học trong Lập trình hướng đối tượng

Tự luyện tập: Playground Swift