openplanning

Hướng dẫn và ví dụ Swift Struct

  1. Struct là gì?
  2. Struct so với Class
  3. Constructor của Struct
  4. Phương thức và thuộc tính của Struct
  5. Struct và Protocol

1. Struct là gì?

Trong Swift, Struct (cấu trúc) là một kiểu giá trị đặc biệt, nó tạo ra một biến để lưu trữ nhiều giá trị riêng lẻ, mà các các trị này có liên quan tới nhau.
Ví dụ thông tin về một nhân viên bao gồm:
  • Mã nhân viên
  • Tên nhân viên
  • Chức vụ
Bạn có thể tạo ra 3 biến để lưu trữ các thông tin trên của nhân viên. Tuy nhiên bạn có thể tạo ra một Struct để lưu trữ cả 3 thông tin trên trong một biến duy nhất.
Swift sử dụng từ khóa struct để khai báo một Struct.
Employee.swift
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:
EmployeeTest.swift
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) 
}
Sửa file main.swift:
main.swift
import Foundation

test_EmployeeStruct()
Chạy ví dụ:
Emp Number: E01
Emp Name: John
Emp Position: CLECK

2. Struct so với Class

Struct thường được sử dụng để tạo ra một đối tượng để lưu trữ các giá trị, trong khi đó class được sử dụng đa dạng hơn.
  • Struct không cho phép thừa kế từ một class hoặc một struct nào khác.
  • Nhưng Struct cho phép thừa kế từ 1 hoặc nhiều Protocol.
Nếu struct xuất hiện như một tham số trong một hàm (hoặc phương thức), nó được truyền (pass) dưới dạng giá trị. Trong khi đó nếu đối tượng của class xuất hiện như là một tham số trong một hàm (hoặc phương thức) nó được truyền (pass) như một tham chiếu (reference).
StructVsClass.swift
import Foundation

// Một lớp
class MyClass  { 
    var name: String = "Abc" 
} 
// Một struct
struct MyStruct { 
    var name: String = "Abc" 
} 
// Một hàm, 2 tham số.
// Tham số đầu tiên là lớp, tham số thứ hai là một struct.
func passToMe( myClass: MyClass, myStruct: MyStruct)   { 
    // Thay đổi giá trị cho trường 'name'.
    myClass.name = "New Name"
    
    // Không thể thay đổi giá trị một trường của struct.
    // (Nó là một bản copy, và các trường của nó trở thành các hằng số)
    // myStruct.name = "New Name" *** 
}  
func test_passToMe()   { 
    // Một đối tượng của MyClass.
    var  mc = MyClass()
    
    print("mc.name = \(mc.name)") // Abc
    
    // Một giá trị của MyStruct.
    var ms = MyStruct() 
    
    print("Call passToMe function")
    
    // Truyền các tham số vào hàm passToMe()
    // Chú ý: Tham số đầu tiên không cần nhãn (Label).
    passToMe( mc, myStruct: ms) 
    
    print("mc.name = \(mc.name)") // New Name 
}
Chạy ví dụ:
mc.name = Abc
Call passToMe function
mc.name = New Name

3. Constructor của Struct

Struct có thể có các Constructor (Phương thức khởi tạo), nhưng không có Destructor (Phương thức hủy đối tượng).
Dưới đây là một số chú ý đối với Constructor:
  • Bạn thể viết một hoặc nhiều Constructor cho struct.
  • Trong Constructor bạn phải gán các giá trị cho tất cả các trường chưa có giá trị.

4. Phương thức và thuộc tính của Struct

Struct có thể có các phương thức (method), thuộc tính (property):
Book.swift
import Foundation

struct Book  {
   // Property
   var title:String    {
      get    {
        return self.title;
      }
      set (value)   {
        self.title = value
      }
   }
   // Property
   var author:String    {
       get {
        return self.author;
       }
       set(value)  {
           self.author = value;
       }
   }
   // Constructor.
   init(  title:String, author:String)  {
      self.title = title;
      self.author = author;
   }
   // Method.
   func getInfo() -> String     {
       return "Book Title: " + self.title + ", Author: " + self.author;
   }
}
Xem thêm về thuộc tính (Property) tại:
  • Swift Properties

5. Struct và Protocol

Struct có thể thừa kế từ một hoặc nhiều Protocol.
  • TODO: TAI LIEU DANG CAP NHAP.