Rate this post

Struct là một kiểu dữ liệu trong ngôn ngữ lập trình Swift, cho phép bạn định nghĩa và tạo ra các kiểu dữ liệu tùy chỉnh có chứa các thuộc tính và phương thức. Hãy cùng W3seo tìm hiểu về kiểu dữ liều này và cách sử dụng nó.

Khái niệm về Struct trong Swift

Struct trong Swift là một kiểu dữ liệu đặc biệt, cho phép bạn định nghĩa và tạo ra các kiểu dữ liệu tùy chỉnh có chứa các thuộc tính và phương thức. Đối với các đối tượng nhỏ và đơn giản, Struct thường được sử dụng thay vì Class trong Swift.

Các đặc điểm chính của Struct trong Swift bao gồm:

  1. Không thể thừa kế: Khác với Class, Struct không hỗ trợ tính năng kế thừa. Điều này có nghĩa là bạn không thể tạo ra một Struct mới bằng cách kế thừa từ một Struct khác.
  2. Giá trị được sao chép: Khi bạn tạo một thể hiện mới của một Struct, một bản sao của toàn bộ giá trị của nó sẽ được tạo ra. Điều này đảm bảo rằng mỗi thể hiện của Struct hoàn toàn độc lập và không ảnh hưởng đến nhau.
  3. Tính bất biến mặc định: Mặc định, các thuộc tính trong Struct là bất biến, có nghĩa là bạn không thể thay đổi giá trị của chúng sau khi đã được khởi tạo. Điều này giúp đảm bảo tính toàn vẹn dữ liệu và an toàn trong quá trình xử lý.
  4. Xử lý giá trị: Struct trong Swift là kiểu dữ liệu giá trị, có nghĩa là khi bạn truyền một Struct cho một hàm hoặc gán nó cho một biến, một bản sao của Struct sẽ được tạo ra và làm việc trên bản sao đó. Điều này đảm bảo không có sự thay đổi xảy ra trực tiếp trên Struct gốc.
  5. Cú pháp khai báo: Để khai báo một Struct trong Swift, bạn sử dụng từ khóa “struct” và định nghĩa tên cho Struct đó, sau đó xác định các thuộc tính và phương thức bên trong ngoặc nhọn.

Struct trong Swift cung cấp một cách tiện lợi để tổ chức và quản lý dữ liệu, đồng thời tăng tính bảo mật và hiệu suất.

Xem thêm Swift là gì?

Struct trong Ngôn ngữ lập trình Swift

Struct trong Swift được hiểu như một kiểu giá trị đặc biệt có khả năng lưu trữ nhiều giá trị liên quan tới nhau trong một biến. Thay vì tạo nhiều biến để lưu trữ thông tin như mã nhân viên, tên nhân viên, và chức vụ, lập trình viên có thể sử dụng Struct để gói gọn cả ba thông tin này trong một biến duy nhất.

Swift sử dụng từ khóa struct để khai báo một Struct. Dưới đây là một ví dụ:

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à một 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 một Struct, cú pháp khá đơn giản, tương tự như cách định nghĩa một class. Dưới đây là một ví dụ:

struct Wallet {    

    var dollars: Int   

    var cents: Int

}

Đặc điểm của Struct

  • Chứa các thuộc tính và phương thức.
  • Cho phép truy cập dữ liệu đối tượng nhanh chóng thông qua việc định nghĩa Subscripts.
  • Có thể chỉnh sửa và tạo mới hàm khởi tạo.
  • Cho phép kế thừa Protocol.
  • Mở rộng tính năng bằng cách sử dụng Extension.

Value Type

Mỗi instance của Struct giữ một bản sao dữ liệu duy nhất của nó. Khi gán cho một hằng, biến, hoặc một hàm, nó sẽ tạo ra một instance mới, độc lập với các instance khác. Dưới đây là một ví dụ:

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"

Thay đổi dữ liệu của Struct

struct OtherEmployee {

    var code: Int

    mutating func changeCode(newCode: Int) {

        self.code = newCode

    }

} 

Ưu điểm của việc sử dụng Struct

Việc sử dụng Struct trong Swift có nhiều ưu điểm sau:

  1. Tính bất biến (Immutable): Các thuộc tính trong Struct mặc định là bất biến, tức là không thể thay đổi giá trị của chúng sau khi đã được khởi tạo. Điều này đảm bảo tính toàn vẹn dữ liệu và tránh những thay đổi không mong muốn.
  2. Sao chép giá trị (Value Type): Struct trong Swift là kiểu giá trị (value type), điều này đồng nghĩa với việc khi gán một Struct cho một biến mới hoặc truyền nó vào một hàm, một bản sao của giá trị Struct sẽ được tạo ra. Điều này giúp đảm bảo các thể hiện Struct là độc lập và không ảnh hưởng lẫn nhau, giúp tránh những xung đột và vấn đề liên quan đến tham chiếu.
  3. Tự động khởi tạo: Swift tự động tạo một hàm khởi tạo miễn phí cho Struct khi bạn khai báo nó. Hàm khởi tạo này sẽ tự động khởi tạo các thuộc tính của Struct với giá trị mặc định. Điều này giúp giảm bớt công việc lập trình và tạo ra mã ngắn gọn hơn.
  4. Tính nhất quán và an toàn: Do tính bất biến và hạn chế các thay đổi trực tiếp, việc sử dụng Struct giúp đảm bảo tính nhất quán và an toàn trong mã của bạn. Điều này giúp tránh những lỗi logic phổ biến như xung đột dữ liệu và dư thừa thông tin.
  5. Truyền dữ liệu dễ dàng: Struct có thể được truyền dữ liệu giữa các phần của ứng dụng dễ dàng thông qua việc truyền tham số hoặc gán giá trị. Điều này làm cho việc truyền dữ liệu giữa các thành phần trở nên đơn giản và rõ ràng.
  6. Hỗ trợ giao thức (Protocol): Struct có thể tuân thủ các giao thức (Protocol) trong Swift, cho phép bạn định nghĩa các yêu cầu và chức năng chung mà một nhóm các Struct có thể tuân thủ. Điều này giúp tăng tính linh hoạt và tái sử dụng mã.

Xem thêm Swift Enumerations/ Swift Enum

Ví dụ minh họa về sử dụng Struct

Dưới đây là một ví dụ minh họa về việc sử dụng Struct trong Swift để đại diện cho một đối tượng hình chữ nhật:

struct Rectangle {
    var width: Double
    var height: Double
    
    func calculateArea() -> Double {
        return width * height
    }
    
    mutating func scaleBy(factor: Double) {
        width *= factor
        height *= factor
    }
}

// Tạo một thể hiện của Struct Rectangle
var rect = Rectangle(width: 5.0, height: 3.0)

// Truy cập thuộc tính và phương thức của Struct
print("Width: \(rect.width)")
print("Height: \(rect.height)")
print("Area: \(rect.calculateArea())")

// Thay đổi giá trị của thuộc tính bằng phương thức mutating
rect.scaleBy(factor: 2.0)
print("Width after scaling: \(rect.width)")
print("Height after scaling: \(rect.height)")

Trong ví dụ trên, chúng ta định nghĩa một Struct có tên là “Rectangle” đại diện cho một hình chữ nhật. Struct này có hai thuộc tính là “width” và “height” để lưu giữ kích thước của hình chữ nhật, và hai phương thức là “calculateArea()” để tính diện tích và “scaleBy()” để thay đổi kích thước của hình chữ nhật.

Chúng ta tạo một thể hiện của Struct “Rectangle” với chiều rộng là 5.0 và chiều cao là 3.0. Sau đó, chúng ta truy cập và in ra giá trị của các thuộc tính và sử dụng phương thức “calculateArea()” để tính diện tích của hình chữ nhật.

Sau đó, chúng ta sử dụng phương thức “scaleBy()” để thay đổi kích thước của hình chữ nhật bằng cách nhân các thuộc tính “width” và “height” với một hệ số. Cuối cùng, chúng ta in ra giá trị mới của các thuộc tính sau khi thay đổi.

Với việc sử dụng Struct, chúng ta có thể dễ dàng quản lý thông tin và thực hiện các thao tác trên các đối tượng hình chữ nhật một cách thuận tiện và tổ chức.

Sự khác biệt giữa Struct và Class

Dưới đây là những khác biệt chính giữa Struct và Class trong Swift:

  1. Tính chất value type và reference type: Struct là kiểu giá trị (value type), trong khi Class là kiểu tham chiếu (reference type). Khi một Struct được gán cho một biến mới hoặc truyền vào một hàm, một bản sao của giá trị Struct sẽ được tạo ra. Trong khi đó, khi một Class được gán cho một biến mới hoặc truyền vào một hàm, chỉ tham chiếu tới đối tượng Class gốc sẽ được tạo ra. Điều này ảnh hưởng đến cách thao tác và quản lý bộ nhớ của các kiểu này.
  2. Khả năng kế thừa: Class hỗ trợ kế thừa, cho phép một Class con có thể kế thừa các thuộc tính và phương thức từ một Class cha. Điều này giúp tái sử dụng mã và xây dựng các cấu trúc phân cấp. Trong khi đó, Struct không hỗ trợ kế thừa.
  3. Tính bất biến (Immutable): Mặc định, các thuộc tính của Struct được xem là bất biến (immutable). Khi một thể hiện Struct đã được tạo, các thuộc tính không thể thay đổi giá trị của chúng. Trong Class, các thuộc tính có thể được thay đổi bất cứ lúc nào.
  4. Tính nhất quán và an toàn: Do tính bất biến của Struct và tính chất tham chiếu của Class, việc sử dụng Struct giúp đảm bảo tính nhất quán và an toàn trong mã. Struct không thể thay đổi từ bên ngoài nên dễ dàng theo dõi và dự đoán hành vi của nó. Class có tính chất tham chiếu, có thể thay đổi từ nhiều nơi trong mã, đòi hỏi sự cẩn trọng hơn trong việc quản lý và theo dõi trạng thái.
  5. Tham chiếu và sao chép: Khi một Class được gán cho một biến khác, tham chiếu đến đối tượng gốc sẽ được tạo ra, không tạo ra một bản sao mới. Điều này có thể dẫn đến việc thay đổi đồng thời giữa các biến tham chiếu cùng một đối tượng. Trong khi đó, khi một Struct được gán cho một biến khác, một bản sao độc lập của giá trị Struct sẽ được tạo ra, vì vậy các biến không liên quan không ảnh hưởng

Trả lời

Email của bạn sẽ không được hiển thị công khai. Các trường bắt buộc được đánh dấu *

Contact Me on Zalo
Call now