Đối với ngôn ngữ lập trình Swift, Struct được hiểu là một kiểu giá trị đặc biệt có thể tạo ra một biến lưu trữ nhiều giá trị khác nhau nhưng lại liên quan tới nhau.
Ví dụ như sau:
- Mã nhân viên
- Tên nhân viên
- Chức vụ
Thay vì phải bỏ nhiều thời gian để tạo ra 3 biến lưu trữ các thông tin của nhân viên thì lập trình viên hoàn toàn có thể sử dụng Struct để lưu trữ 3 thông tin trong cùng 1 biến.
Swift sử dụng từ khóa struct để khai báo một Struct.
import Foundation
struct Employee {
var empNumber:String
var empName:String
var position:String
// Constructor.
init(empNumber:String, empName:String, position:String) {
self.empNumber = empNumber;
self.empName = empName;
self.position = position;
}
}
Ví dụ sử dụng Struct:
import Foundation
func test_EmployeeStruct() {
// Tạo một biến kiểu struct Employee.
let john = Employee(empNumber:"E01",empName: "John",position: "CLERK")
print("Emp Number: " + john.empNumber)
print("Emp Name: " + john.empName)
print("Emp Position: " + john.position)
}
Định nghĩa Structures
Để định nghĩa Struct khá đơn giản, nó giống như cách định nghĩ class . Để hiểu rõ hơn, mời bạn tham khảo ở ví dụ dưới đây.
struct Wallet {
var dollars: Int
var cents: Int
}
Đặc điểm
- Chứa các properties, methods
- Truy cập dữ liệu đối tượng nhanh hơn bằng việc định nghĩa Subscripts
- Chỉnh sửa và tạo mới lại hàm khởi tạo
- Cho phép kế thừa Protocol
- Mở rộng tính năng bằng việc sử dụng Extension để mở rộng tính năng
Value Type
Mỗi instance sẽ giữ một bản sao dữ liệu duy nhất của nó. Khi được gán cho một hằng, biến hoặc một hàm nó sẽ khởi tạo một instance mới. Vì thế, nếu giá trị của 1 instance nào đó bị thay đổi sẽ không làm ảnh hưởng tới các instance khác. Bạn có thể tham khảo ví dụ dưới đây để hiểu rõ hơn.
struct Employee {
var code: Int
var name: String
var address: String
}
var a = Employee(code: 5, name: "BXH", address: "Sun*")
var b = a
b.name = "MH"
print(a.name) // In ra "BXH"
print(b.name) // In ra "MH"
// Nhận thấy instance a khi được gắn cho b, nó sẽ copy giá
// trị và tạo ra một instance mới có giá trị giống với a nhưng
// độc lập với a. Do đó khi thay đổi name của b, name của a
// không bị thay đổi theo
Thay đổi dữ liệu của struct
struct OtherEmployee {
var code: Int
mutating func changeCode(newCode: Int) {
self.code = newCode
}
}
Lý do nên dùng Struct
- Tạo ra một dữ liệu chứa các kiểu dữ liệu cơ sở như Int, String, Double…
- Hoàn toàn không cần phải sử dụng tới tham chiếu khi mà dữ liệu đơn thuần chỉ có chứa các properties giá trị
- Chọn struct nếu không có nhu cầu kế thừa các Struct khác.
- Tạo ra được nhiều đối tượng với những thuộc tính khác nhau có kiểu dữ liệu cơ sở như Int, Float, String, …
- Khi làm việc đa luồng. Ví dụ kết nối database được thực hiện trên một luồng song với luồng Main, việc sử dụng Struct an toàn hơn do nó có thể copy giá trị từ luồng này sang luồng khác.
- Đảm bảo không có phần nào trong code có được tham chiếu tới đối tượng của chúng ta trừ khi ta truy xuất thẳng tới chúng. Do đó, dễ quản lý, việc kiểm soát giá trị đối tượng khi bị thay đổi cũng trở nên đơn giản hơn.