Chúng ta có thể định nghĩa các thuộc tính để liên kết các giá trị với một lớp, cấu trúc và kiểu liệt kê. Trong swift, chúng ta có thể định nghĩa hai loại thuộc tính là thuộc tính Đã lưu trữ và thuộc tính được tính toán. Tuy nhiên, thuộc tính được lưu trữ lưu trữ các biến và giá trị không đổi dưới dạng các thuộc tính của lớp. Mặt khác, các thuộc tính được tính toán sẽ tính toán các giá trị dựa trên một giá trị cụ thể. Chúng ta có thể xác định các thuộc tính được tính toán trong Lớp, Cấu trúc và Kiểu liệt kê; tuy nhiên, các thuộc tính được lưu trữ chỉ có thể được định nghĩa trong các lớp và cấu trúc.
Các bài viết khác:
Khái niệm về thuộc tính trong Swift
Thuộc tính trong Swift là các biến hoặc hằng số được liên kết với một đối tượng hoặc kiểu dữ liệu cụ thể. Chúng được sử dụng để lưu trữ và truy xuất các giá trị liên quan đến đối tượng đó.
Thuộc tính cho phép chúng ta lưu trữ và truy xuất thông tin liên quan đến đối tượng, đồng thời cung cấp tính linh hoạt và khả năng mở rộng trong việc xử lý dữ liệu.
Các loại thuộc tính trong Swift
Trong Swift, có ba loại thuộc tính chính: thuộc tính lưu trữ (stored properties), thuộc tính tính toán (computed properties) và thuộc tính quản lý (property observers).
- Thuộc tính lưu trữ (Stored properties):
Là các biến hoặc hằng số được liên kết với một đối tượng.Lưu trữ giá trị thực tế của thuộc tính trong bộ nhớ.Có thể là biến (var) hoặc hằng (let).Được khai báo trong khối dữ liệu của lớp hoặc cấu trúc.
Ví dụ:
struct Rectangle { var width: Double // Thuộc tính lưu trữ biến let height: Double // Thuộc tính lưu trữ hằng // ... }
- Thuộc tính tính toán (Computed properties):
- Không lưu trữ giá trị trực tiếp, mà tính toán giá trị dựa trên các giá trị khác.Được khai báo với từ khóa “var” và cung cấp phương thức getter và/hoặc setter để tính toán và truy xuất giá trị.Được sử dụng như các thuộc tính thông thường khi gọi.
struct Circle { var radius: Double // Thuộc tính lưu trữ var diameter: Double { // Thuộc tính tính toán get { return radius * 2 } set { radius = newValue / 2 } } }
Trong ví dụ trên, radius
là một thuộc tính lưu trữ và diameter
là một thuộc tính tính toán. Khi truy cập vào diameter
, phương thức getter tính toán giá trị dựa trên radius
, trong khi phương thức setter cập nhật giá trị của radius
dựa trên giá trị mới của diameter
.
- Thuộc tính quản lý (Property observers):
- Cho phép bạn theo dõi và phản ứng khi giá trị của thuộc tính thay đổi.Cung cấp hai phương thức:
willSet
(trước khi giá trị thay đổi) vàdidSet
(sau khi giá trị thay đổi).Được sử dụng để thực hiện các hoạt động phụ hoặc xử lý khi giá trị của thuộc tính thay đổi.
- Cho phép bạn theo dõi và phản ứng khi giá trị của thuộc tính thay đổi.Cung cấp hai phương thức:
class Person { var name: String { didSet { print("Tên đã thay đổi từ \(oldValue) thành \(name)") } } }
Xem thêm Truy vấn Plan Cache Commands trong MongoDB
Truy cập vào thuộc tính
Truy cập vào thuộc tính trong Swift được thực hiện bằng cách sử dụng cú pháp “.” sau đối tượng hoặc biến để truy cập đến thuộc tính mong muốn. Có hai loại truy cập chính: truy cập vào thuộc tính lưu trữ (stored properties) và truy cập vào thuộc tính tính toán (computed properties).
- Truy cập vào thuộc tính lưu trữ:
- Đối với thuộc tính lưu trữ biến (var), bạn có thể đọc và ghi giá trị của thuộc tính.Đối với thuộc tính lưu trữ hằng (let), bạn chỉ có thể đọc giá trị của thuộc tính.
struct Rectangle { var width: Double // Thuộc tính lưu trữ biến let height: Double // Thuộc tính lưu trữ hằng } var rectangle = Rectangle(width: 10.0, height: 5.0) let width = rectangle.width // Truy cập đọc giá trị thuộc tính lưu trữ biến rectangle.width = 15.0 // Truy cập ghi giá trị thuộc tính lưu trữ biến
Truy cập vào thuộc tính tính toán:
- Đối với thuộc tính tính toán, bạn sử dụng cú pháp như truy cập vào một thuộc tính lưu trữ, nhưng không cần ghi rõ phần getter hoặc setter.Khi bạn truy cập vào thuộc tính tính toán, phương thức getter hoặc setter được gọi tự động để tính toán hoặc truy xuất giá trị.
struct Circle { var radius: Double // Thuộc tính lưu trữ var diameter: Double { // Thuộc tính tính toán get { return radius * 2 } set { radius = newValue / 2 } } } var circle = Circle(radius: 5.0) let diameter = circle.diameter // Truy cập vào thuộc tính tính toán circle.diameter = 10.0 // Truy cập và gán giá trị cho thuộc tính tính toán
Truy cập vào thuộc tính cho phép bạn đọc và ghi giá trị của thuộc tính lưu trữ, cũng như tính toán và truy xuất giá trị của thuộc tính tính toán. Điều này giúp bạn làm việc với các thông tin liên quan đến đối tượng một cách linh hoạt và dễ dàng.
Xem thêm Swift 4.0 là gì?
Thuộc tính dạng theo dõi
Trong Swift, thuộc tính dạng báo (property observers) cho phép bạn theo dõi và phản ứng khi giá trị của thuộc tính thay đổi. Có hai loại thuộc tính dạng báo: willSet
và didSet
.
willSet
:- Được gọi trước khi giá trị của thuộc tính thay đổi.Bạn có thể sử dụng tham số
newValue
để truy cập giá trị mới được gán cho thuộc tính.Đặt mã xử lý trong khốiwillSet
để thực hiện các hoạt động trước khi giá trị thay đổi.
- Được gọi trước khi giá trị của thuộc tính thay đổi.Bạn có thể sử dụng tham số
class Person { var name: String { willSet { print("Tên sẽ được thay đổi thành \(newValue)") } } } let person = Person() person.name = "John"
Khi giá trị của thuộc tính name
được gán, phương thức willSet
được gọi trước khi giá trị thay đổi. Trong ví dụ trên, khi person.name
được gán giá trị “John”, câu thông báo “Tên sẽ được thay đổi thành John” sẽ được in ra màn hình.
didSet
:- Được gọi sau khi giá trị của thuộc tính đã thay đổi.Bạn có thể sử dụng tham số
oldValue
để truy cập giá trị cũ của thuộc tính.Đặt mã xử lý trong khốididSet
để thực hiện các hoạt động sau khi giá trị đã thay đổi.
- Được gọi sau khi giá trị của thuộc tính đã thay đổi.Bạn có thể sử dụng tham số
class Person { var age: Int { didSet { print("Tuổi đã thay đổi từ \(oldValue) thành \(age)") } } } let person = Person() person.age = 30
Khi giá trị của thuộc tính age
thay đổi, phương thức didSet
được gọi sau khi giá trị đã thay đổi. Trong ví dụ trên, khi person.age
được gán giá trị 30, câu thông báo “Tuổi đã thay đổi từ 0 thành 30” sẽ được in ra màn hình.
Thuộc tính dạng báo cho phép bạn kiểm soát và phản ứng khi giá trị của thuộc tính thay đổi, từ đó thực hiện các hoạt động phụ hoặc xử lý tương ứng.
Xem thêm Swift Enumerations/ Swift Enum
Thuộc tính lười biếng (Lazy Properties)
Trong Swift, thuộc tính lười biếng (lazy properties) là các thuộc tính được khởi tạo chỉ khi cần thiết, tức là khi bạn thực sự truy cập vào chúng. Điều này giúp tiết kiệm tài nguyên và tăng hiệu suất của ứng dụng.
Các điểm quan trọng về thuộc tính lười biếng:
- Được khai báo bằng cách sử dụng từ khóa
lazy
trước kiểu dữ liệu của thuộc tính. - Chỉ áp dụng cho thuộc tính biến (var), không áp dụng cho thuộc tính hằng (let).
- Thuộc tính lười biếng chỉ được khởi tạo một lần và giá trị được lưu trữ để sử dụng cho các lần truy cập sau này.
- Giá trị của thuộc tính lười biếng không được đảm bảo trước khi nó được truy cập. Khi được truy cập lần đầu tiên, nó sẽ được khởi tạo và giá trị sẽ được tính toán.
- Thuộc tính lười biếng thường được sử dụng để tránh việc khởi tạo hoặc tính toán giá trị ngay từ đầu, đặc biệt khi giá trị đó có thể tốn kém hoặc không cần thiết trong mọi tình huống.
Ví dụ:
class ImageProcessor { lazy var imageFilter = ImageFilter() // ... } let processor = ImageProcessor() // Trước khi truy cập vào thuộc tính imageFilter, nó chưa được khởi tạo // Khi truy cập vào thuộc tính lần đầu tiên, nó sẽ được khởi tạo processor.imageFilter.process(image)
Trong ví dụ trên, thuộc tính imageFilter
là một thuộc tính lười biếng trong lớp ImageProcessor
. Nó chỉ được khởi tạo khi bạn truy cập vào nó lần đầu tiên, trong trường hợp này là khi gọi phương thức process
trên imageFilter
. Lần truy cập tiếp theo, giá trị của thuộc tính đã được tính toán và được sử dụng lại.
Việc sử dụng thuộc tính lười biếng giúp tăng hiệu suất và tối ưu hóa việc sử dụng tài nguyên trong ứng dụng, đặc biệt là trong trường hợp có những thuộc tính có thể tốn kém hoặc không cần thiết trong mọi tình huống.
Xem thêm Đối tượng dữ liệu và loại thuộc tính trong Data mining