Menu
CoddyTech

Thành viên tĩnh

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 14 trên 57.

Thuộc tính static thuộc về chính kiểu dữ liệu, không thuộc về bất kỳ instance nào. Chỉ có duy nhất một bản sao, được truy cập thông qua tên kiểu dữ liệu:

struct Temperature {
    static let freezing = 0.0
    static let boiling = 100.0
    var celsius: Double
}

print(Temperature.boiling - Temperature.freezing)

Đầu ra:

100.0

Một static var có thể thay đổi, nên hữu ích khi lưu dữ liệu được chia sẻ giữa tất cả các instance, chẳng hạn như bộ đếm số lượng instance đã được tạo:

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)

Đầu ra:

1
2
2

Một static func được gọi trên kiểu dữ liệu. Nó không có đối tượng self để làm việc cùng, nên chỉ dùng các đối số và những thành viên tĩnh khác. Đây là nơi phù hợp để đặt các hàm tiện ích và những cách có tên để tạo đối tượng:

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)

Đầu ra:

384

Bên trong kiểu, Self là một cách khác để gọi tên kiểu đó, nên bạn có thể viết các thành viên tĩnh như Self.issued. Phương thức thể hiện có thể đọc các thành viên tĩnh, nhưng phương thức tĩnh không thể đọc các thuộc tính của thể hiện vì nó không được gọi trên một thể hiện.

struct Level {
    static let maximum = 10
    var current = 1
    func isMax() -> Bool { current == Self.maximum }   // instance đọc thuộc tính static
    static func describe() -> String { "levels 1-\(maximum)" } // static đọc thuộc tính static
}
challenge icon

Thử thách

Dễ

Hoàn thiện lớp Order. Thuộc tính tĩnh nextId bắt đầu ở giá trị 1, mỗi đơn hàng mới lấy giá trị hiện tại của nextId làm id rồi tăng nextId. Hằng số tĩnh taxPercent có giá trị 10. Phương thức của instance total() trả về giá trị tổng phụ cộng với thuế (làm tròn xuống), còn phương thức tĩnh summary(of:) nhận một mảng đơn hàng và trả về 3 orders, 660 total.

Code được cung cấp đọc một giá trị tổng phụ trên mỗi dòng, tạo một đơn hàng cho mỗi giá trị, in ra #1: 110 cho từng đơn hàng, rồi cuối cùng in ra phần tóm tắt.

Viết code của bạn trong Order.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 có sẵn: giữ nguyên
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 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