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.50description đượ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)]
6Cá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: 5Giữ 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"
}
}
}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]))
}
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