Trong lập trình Swift, việc quản lý các thuộc tính của một đối tượng không chỉ bao gồm việc đọc chúng mà còn cả việc tạo và thay đổi chúng khi cần thiết. Để làm điều này, từ khóa "set" được sử dụng trong setter của thuộc tính. Setter cho phép bạn tùy chỉnh hành vi khi thuộc tính được gán giá trị mới, nhờ đó có thể kiểm tra giá trị hoặc thực hiện các thao tác liên quan khác.
Định nghĩa Setter trong Swift
Swift cung cấp cách đơn giản và trực quan để định nghĩa các setter thông qua cú pháp thuộc tính có giám sát (property observer). Có hai loại thuộc tính có giám sát chính là willSet
và didSet
. Tuy nhiên, để định nghĩa một setter cơ bản, các bạn chỉ cần sử dụng từ khóa "set".
class Person {
var name: String {
willSet(newName) {
print("Name will be set to \(newName)")
}
didSet {
print("Name was changed from \(oldValue) to \(name)")
}
}
init(name: String) {
self.name = name
}
}
Trong ví dụ trên, ta có một lớp Person
với một thuộc tính name
. Khi name
được gán giá trị mới, các phương thức willSet
và didSet
được gọi. willSet
được gọi ngay trước khi giá trị mới được gán, cho phép bạn thực hiện các thao tác nào đó dựa trên giá trị mới, trong khi didSet
được gọi ngay sau khi giá trị đã được gán, cho phép bạn thực hiện các thao tác dựa trên giá trị cũ và giá trị mới.
Tùy chỉnh Setter
Đôi khi, bạn cần kiểm tra giá trị mới trước khi gán nó cho thuộc tính. Trong trường hợp này, bạn có thể tự định nghĩa một setter.
class Circle {
var radius: Double {
get {
return _radius
}
set(newRadius) {
if newRadius > 0 {
_radius = newRadius
} else {
print("Invalid radius. The radius must be positive.")
}
}
}
private var _radius: Double
init(radius: Double) {
self._radius = radius
}
}
Trong ví dụ trên, Circle
có thuộc tính radius
được tùy chỉnh với setter. Setter kiểm tra xem giá trị mới có lớn hơn không trước khi gán nó cho biến _radius
. Nếu không, một thông báo lỗi sẽ được in ra.
Tạo Setter Ẩn Danh
Khi bạn không cần tên cụ thể cho tham số giá trị mới trong setter, bạn có thể sử dụng từ khóa newValue
.
class Rectangle {
var width: Double {
get {
return _width
}
set {
_width = newValue > 0 ? newValue : 0
}
}
private var _width: Double
init(width: Double) {
self._width = width > 0 ? width : 0
}
}
Trong ví dụ trên, setter của width
sử dụng newValue
để gán giá trị mới. Điều này làm cho mã nguồn ngắn gọn và dễ đọc.
Lợi ích của Việc Sử Dụng Setter
- Kiểm tra Dữ liệu: Bằng cách kiểm tra giá trị mới trước khi gán, bạn có thể ngăn chặn việc gán các giá trị không hợp lệ.
- Thực Hiện Các Hoạt Động Bổ Sung: Setter cho phép bạn thực hiện các thao tác bổ sung như ghi log, cập nhật giao diện người dùng hay thông báo tới các phần khác của chương trình.
- Duy Trì Tính Nhất Quán: Bạn có thể sử dụng setter để đảm bảo rằng giá trị của thuộc tính luôn nhất quán và phù hợp với các quy tắc kinh doanh của ứng dụng.
Kết Luận
Việc làm quen và sử dụng từ khóa "set" trong Swift sẽ giúp bạn quản lý các thuộc tính của lớp một cách hiệu quả hơn, đồng thời mở ra nhiều khả năng tùy chỉnh hành vi của các thuộc tính khi nhận giá trị mới. Điều này không chỉ giúp mã nguồn trở nên dễ bảo trì mà còn đảm bảo tính chính xác và bảo mật trong quá trình phát triển ứng dụng.
Comments