Tìm Hiểu Class Trong Swift
Class là gì?
Class trong Swift là một bản thiết kế (blueprint) để tạo ra các đối tượng (objects). Mỗi đối tượng được tạo ra từ một class sẽ có các thuộc tính (properties) và hành vi (methods) giống nhau. Class cho phép bạn tạo các đối tượng (objects) và cung cấp các tính năng quan trọng như kế thừa, khởi tạo, và quản lý dữ liệu thông qua các thuộc tính (properties) và phương thức (methods). Trong Swift, Class (Lớp) là một trong những nền tảng cốt lõi của lập trình hướng đối tượng (OOP).
Tại sao sử dụng Class?
- Tổ chức code: Class giúp bạn tổ chức code một cách logic, dễ hiểu và dễ bảo trì.
- Kế thừa: Class cho phép bạn tạo ra các class con kế thừa từ class cha, giúp tái sử dụng code và tạo ra các hệ thống phân cấp.
- Đa hình: Các đối tượng của các class khác nhau có thể được sử dụng thông qua một giao diện chung (protocol), cho phép bạn viết code linh hoạt hơn.
Khai Báo Class
- Khai Báo Class
Bạn khai báo Class bằng từ khóa
class
và có thể thêm các thuộc tính, phương thức bên trong để định nghĩa hành vi và trạng thái của đối tượng.
class Person {
var name: String
var age: Int
init(name: String, age: Int) {
self.name = name
self.age = age
}
func introduce() {
print("Hello, my name is \(name) and I am \(age) years old.")
}
}
Khởi tạo đối tượng:
// Khởi tạo đối tượng
let person = Person(name: "Alice", age: 25)
person.introduce()
// Kết quả: "Hello, my name is Alice and I am 25 years old."
Các khái niệm quan trọng trong Class
- Thuộc tính (Properties): Đặc trưng của một đối tượng.
- Phương thức (Methods): Hành động mà một đối tượng có thể thực hiện.
- Initializer: Phương thức đặc biệt được gọi khi tạo một đối tượng mới.
- Deinitializer: Phương thức được gọi ngay trước khi một đối tượng bị hủy.
- Kế thừa: Quá trình một class kế thừa các thuộc tính và phương thức từ một class khác.
- Đa hình: Khả năng của các đối tượng thuộc các class khác nhau thực hiện cùng một hành động theo những cách khác nhau.
Các Thành Phần Trong Class
Thuộc tính (Properties)
2.1. Thuộc tính (Properties) Thuộc tính lưu trữ dữ liệu liên quan đến đối tượng.
class Car {
var brand: String
var speed: Int
init(brand: String, speed: Int) {
self.brand = brand
self.speed = speed
}
}
Phương thức (Methods)
2.2. Phương thức (Methods) Phương thức là các hành động hoặc chức năng liên quan đến đối tượng.
class Car {
var brand: String
var speed: Int
init(brand: String, speed: Int) {
self.brand = brand
self.speed = speed
}
func drive() {
print("\(brand) is driving at \(speed) km/h.")
}
}
Thuộc tính tính toán (Computed Properties)
2.3. Thuộc tính tính toán (Computed Properties) Giống như trong Struct, bạn có thể sử dụng thuộc tính tính toán trong Class.
class Rectangle {
var width: Double
var height: Double
var area: Double {
return width * height
}
init(width: Double, height: Double) {
self.width = width
self.height = height
}
}
let rect = Rectangle(width: 10.0, height: 5.0)
print(rect.area) // Kết quả: 50.0
Sự Khác Biệt Giữa Class Và Struct
- Sự Khác Biệt Giữa Class Và Struct
Đặc điểm | Class | Struct |
---|---|---|
Kiểu dữ liệu | Tham chiếu (Reference Type) | Giá trị (Value Type) |
Truyền dữ liệu | Gán một Class sẽ chia sẻ cùng vùng nhớ | Gán Struct tạo một bản sao mới |
Hỗ trợ kế thừa | Có | Không |
Khả năng mutating | Không cần mutating khi thay đổi thuộc tính | Cần mutating cho phương thức thay đổi |
Ví dụ minh họa kiểu tham chiếu của Class:
class Person {
var name: String
init(name: String) {
self.name = name
}
}
let person1 = Person(name: "John")
let person2 = person1
person2.name = "Alice"
print(person1.name) // Kết quả: "Alice"
Kế Thừa (Inheritance)
- Kế Thừa (Inheritance) Class hỗ trợ kế thừa, cho phép bạn mở rộng chức năng từ Class khác.
class Animal {
var name: String
init(name: String) {
self.name = name
}
func sound() {
print("\(name) makes a sound.")
}
}
class Dog: Animal {
override func sound() {
print("\(name) barks.")
}
}
let dog = Dog(name: "Buddy")
dog.sound()
// Kết quả: "Buddy barks."
<!-- var breed: String -->
Deinitialization (Hàm hủy)
- Deinitialization (Hàm hủy)
Class có thể định nghĩa một hàm hủy
deinit
để giải phóng tài nguyên khi đối tượng bị xóa.
class FileHandler {
init() {
print("File opened.")
}
deinit {
print("File closed.")
}
}
var handler: FileHandler? = FileHandler()
// Kết quả: "File opened."
handler = nil
// Kết quả: "File closed."
Tính Đa Hình (Polymorphism)
- Tính Đa Hình (Polymorphism) Class hỗ trợ tính đa hình thông qua kế thừa và ghi đè phương thức.
class Shape {
func draw() {
print("Drawing a shape.")
}
}
class Circle: Shape {
override func draw() {
print("Drawing a circle.")
}
}
class Square: Shape {
override func draw() {
print("Drawing a square.")
}
}
let shapes: [Shape] = [Circle(), Square()]
for shape in shapes {
shape.draw()
}
// Kết quả:
// "Drawing a circle."
// "Drawing a square."
Tính Đóng Gói (Encapsulation)
- Tính Đóng Gói (Encapsulation)
Bạn có thể sử dụng các cấp độ truy cập (
private
,public
,internal
,fileprivate
) để giới hạn quyền truy cập vào thuộc tính hoặc phương thức của Class.
class BankAccount {
private var balance: Double = 0.0
func deposit(amount: Double) {
balance += amount
}
func getBalance() -> Double {
return balance
}
}
let account = BankAccount()
account.deposit(amount: 1000)
print(account.getBalance()) // Kết quả: 1000
Từ Khóa final
- Từ Khóa
final
Bạn có thể sử dụng từ khóafinal
để ngăn một Class bị kế thừa hoặc phương thức bị ghi đè.
final class Animal {
var name: String
init(name: String) {
self.name = name
}
}
Khi nào nên sử dụng Class?
- Khi nào nên sử dụng Class? Class được sử dụng trong các trường hợp:
- Khi bạn cần mô tả các đối tượng phức tạp có nhiều thuộc tính và phương thức.
- Khi bạn muốn sử dụng tính kế thừa để mở rộng hoặc tái sử dụng mã.
- Khi đối tượng cần được chia sẻ và tham chiếu giữa các phần khác nhau của ứng dụng.
Kết Luận
Class là một công cụ mạnh mẽ trong Swift, hỗ trợ lập trình hướng đối tượng với các tính năng như kế thừa, tính đa hình và đóng gói. Với việc hiểu rõ cách sử dụng Class, bạn có thể xây dựng các ứng dụng Swift linh hoạt, dễ bảo trì và tối ưu hóa cho nhiều trường hợp sử dụng khác nhau. Hãy thực hành để làm chủ công cụ quan trọng này!
Mở rộng
- Kế thừa trong Swift
- Đa hình trong Swift
- Protocol trong Swift
- Extension trong Swift
- Property observer
- Access control