Menu
CoddyTech

CustomStringConvertible

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

Khi bạn in ra một giá trị, theo mặc định Swift hiển thị kiểu dữ liệu và các thuộc tính của giá trị đó, còn với một lớp thì chỉ hiển thị tên kiểu. Tuân theo CustomStringConvertible và cung cấp description giúp kiểm soát văn bản được hiển thị:

struct Money {
    let cents: Int
}
struct Price: CustomStringConvertible {
    let cents: Int
    var description: String { "$\(cents / 100).\(cents % 100)" }
}

print(Money(cents: 1250))
print(Price(cents: 1250))

Đầu ra:

Money(cents: 1250)
$12.50

description được dùng bởi print, phép nội suy chuỗi và String(describing:), nên một thuộc tính kiểm soát mọi nơi hiển thị giá trị:

struct Point: CustomStringConvertible {
    let x: Int, y: Int
    var description: String { "(\(x), \(y))" }
}

let p = Point(x: 2, y: 5)
print("start at \(p)")
print([p, Point(x: 0, y: 0)])
print(String(describing: p).count)

Đầu ra:

start at (2, 5)
[(2, 5), (0, 0)]
6

Các lớp được hưởng lợi nhiều nhất, vì nếu không, khi in một thực thể của lớp, bạn chỉ thấy tên kiểu dữ liệu của nó:

class Account {
    let owner: String
    var balance: Int
    init(owner: String, balance: Int) { self.owner = owner; self.balance = balance }
}

class NamedAccount: CustomStringConvertible {
    let owner: String
    var balance: Int
    init(owner: String, balance: Int) { self.owner = owner; self.balance = balance }
    var description: String { "\(owner): \(balance)" }
}

print(Account(owner: "Ada", balance: 5))
print(NamedAccount(owner: "Ada", balance: 5))

Đầu ra:

main.Account
Ada: 5

Giữ description ngắn gọn, dễ đọc với mọi người. Nội dung này không dành cho việc phân tích cú pháp và không nên làm thay đổi giá trị:

enum Status: CustomStringConvertible {
    case active, suspended
    var description: String {
        switch self {
        case .active: return "active"
        case .suspended: return "suspended"
        }
    }
}
challenge icon

Thử thách

Dễ

Hãy làm cho cấu trúc Fraction (tử số, mẫu số) tuân theo CustomStringConvertible. Thuộc tính description hiển thị phân số ở dạng tối giản: 6/8 in ra thành 3/4, 4/2 thành 2, 0/5 thành 0, còn phân số âm giữ dấu ở phía trước (-1/2). Hãy viết hàm hỗ trợ gcd(_:_:) để rút gọn phân số.

Code được cung cấp đọc các phân số a/b, mỗi phân số trên một dòng, rồi in từng phân số bằng print.

Viết code của bạn trong Fraction.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 đã cung cấp: giữ nguyên
var input: [String] = []
while let line = readLine() { input.append(line) }
for line in input {
    let p = line.split(separator: "/").map { Int($0)! }
    print(Fraction(numerator: p[0], denominator: p[1]))
}
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