openplanning

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

Xem thêm các chuyên mục:

Nhóm phát triển của chúng tôi vừa ra mắt website langlearning.net học tiếng Anh, Nga, Đức, Pháp, Việt, Trung, Hàn, Nhật, ... miễn phí cho tất cả mọi người.
Là một website được viết trên công nghệ web Flutter vì vậy hỗ trợ rất tốt cho người học, kể cả những người học khó tính nhất.
Hiện tại website đang tiếp tục được cập nhập nội dung cho phong phú và đầy đủ hơn. Mong các bạn nghé thăm và ủng hộ website mới của chúng tôi.
Hãy theo dõi chúng tôi trên Fanpage để nhận được thông báo mỗi khi có bài viết mới. Facebook

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.
  1. Struct không cho phép thừa kế từ một class hoặc một struct nào khác.
  2. 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:
  1. Bạn thể viết một hoặc nhiều Constructor cho struct.
  2. 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:
  • TODO Link?

5- Struct và Protocol

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

Xem thêm các chuyên mục: