Menu
CoddyTech

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
412

Mỗ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 30

Mộ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.0
challenge icon

Thử 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())
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