Lớp là tham chiếu
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 5 trên 57.
Lớp là một kiểu tham chiếu: biến lưu tham chiếu đến đối tượng, chứ không phải bản sao của đối tượng đó. Gán một instance cho biến khác sẽ tạo thêm một tên cho cùng một đối tượng:
class Wallet {
var coins = 10
}
let mine = Wallet()
let alias = mine
alias.coins = 25
print(mine.coins)Đầu ra:
25=== kiểm tra xem hai tham chiếu có trỏ đến cùng một đối tượng hay không. Hai đối tượng riêng biệt vẫn khác nhau, ngay cả khi mọi thuộc tính của chúng đều giống nhau:
class Wallet {
var coins = 10
}
let a = Wallet()
let b = a
let c = Wallet()
print(a === b)
print(a === c)Đầu ra:
true
falseMột hàm nhận một đối tượng sẽ thao tác trên đối tượng của bên gọi, vì vậy các thay đổi bên trong hàm vẫn hiển thị sau đó:
class Wallet {
var coins = 10
}
func payFee(_ wallet: Wallet) {
wallet.coins -= 3
}
let w = Wallet()
payFee(w)
payFee(w)
print(w.coins)Đầu ra:
4let cố định tham chiếu, không phải đối tượng. Một hằng số chứa một thực thể của lớp không thể trỏ đến thực thể khác, nhưng các thuộc tính var của thực thể đó vẫn có thể thay đổi. Mảng các thực thể cũng chứa tham chiếu:
class Wallet {
var coins = 10
}
let shared = Wallet()
let team = [shared, shared]
team[0].coins = 99
print(shared.coins)
print(team[1].coins)Đầu ra:
99
99Thử thách
DễMột nhóm cùng sử dụng một Budget. Hoàn thiện spend(_:amount:), một hàm (function) nhận ngân sách và chỉ trừ đi số tiền khi ngân sách còn đủ, trả về true khi khoản chi được phép. Sau đó hoàn thiện runTeam(start:purchases:): tạo một ngân sách, để mỗi khoản mua trừ tiền từ cùng ngân sách đó và trả về một dòng cho mỗi khoản mua (ok 30 hoặc denied 80), tiếp theo là left 20.
Code được cung cấp sẽ đọc ngân sách ban đầu và các khoản mua từ một dòng, phân tách bằng dấu phẩy, rồi in ra từng dòng được trả về.
Code của bạn nằm trong Budget.swift và Functions.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 purchases = input[1].split(separator: ",").map { Int($0)! }
for line in runTeam(start: Int(input[0])!, purchases: purchases) { print(line) }
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
1Lớp và đối tượng
Làm việc với tệpĐịnh nghĩa lớpPhương thức và selfHàm khởi tạoLớp là tham chiếuÔn tập: Thẻ thư viện2Struct và kiểu giá trị
StructNgữ nghĩa giá trịPhương thức thay đổiStruct hay classÔn tập: mặt hàng trong kho5Kế thừa
Lớp conGhi đè phương thứcHàm khởi tạo và superfinal và hệ phân cấpÔn tập: hệ phân cấp nhân viên8Các giao thức tiêu chuẩn
CustomStringConvertibleEquatableComparableHashableÔn tập: Sắp xếp tùy chỉnhTự luyện tập: Playground Swift