Hàm khởi tạo
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 4 trên 57.
Hàm khởi tạo (initializer), được viết là init, chạy khi một instance được tạo và gán giá trị ban đầu cho các thuộc tính. Các tham số của hàm trở thành đối số trong lời gọi kiểu dữ liệu:
class Book {
var title: String
var pages: Int
init(title: String, pages: Int) {
self.title = title
self.pages = pages
}
}
let book = Book(title: "Dune", pages: 412)
print(book.title)
print(book.pages)Đầu ra:
Dune
412Mỗi thuộc tính cần có giá trị trước khi bạn có thể sử dụng đối tượng. Bạn phải gán giá trị cho thuộc tính không có giá trị mặc định trong init, nếu không lớp sẽ không biên dịch. Bạn có thể gán giá trị cho thuộc tính được khai báo bằng let một lần trong init và không thay đổi thuộc tính đó sau này:
class Book {
let isbn: String // chỉ gán một lần trong init
var title: String
init(isbn: String, title: String) {
self.isbn = isbn
self.title = title
}
}Tham số của init có thể có giá trị mặc định, nên bên gọi chỉ cần truyền những giá trị khác:
class Timer {
var seconds: Int
var label: String
init(seconds: Int, label: String = "timer") {
self.seconds = seconds
self.label = label
}
}
let egg = Timer(seconds: 300, label: "egg")
let quick = Timer(seconds: 30)
print("\(egg.label) \(egg.seconds)")
print("\(quick.label) \(quick.seconds)")Đầu ra:
egg 300
timer 30Một lớp có thể có nhiều hàm khởi tạo, mỗi hàm nhận các tham số khác nhau. convenience init điền một số giá trị rồi gọi hàm khởi tạo chính bằng self.init(...):
class Temperature {
var celsius: Double
init(celsius: Double) {
self.celsius = celsius
}
convenience init(fahrenheit: Double) {
self.init(celsius: (fahrenheit - 32) * 5 / 9)
}
}
print(Temperature(celsius: 20).celsius)
print(Temperature(fahrenheit: 212).celsius)Đầu ra:
20.0
100.0Thử thách
DễViết hàm khởi tạo của lớp Account. Hàm này nhận owner và balance không bắt buộc, mặc định là 0, rồi lưu cả hai. Sau đó hoàn thiện summary(), hàm này trả về Ada has 150.
Code được cung cấp đọc tên chủ sở hữu và, nếu có dòng thứ hai, đọc số dư ban đầu. Code tạo tài khoản có hoặc không có số dư rồi in ra summary().
Viết code trong Account.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) }
let account = input.count > 1 ? Account(owner: input[0], balance: Int(input[1])!) : Account(owner: input[0])
print(account.summary())
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