Hiện tại chúng ta đã học được nhiều kiến thức cơ bản về ngôn ngữ Swift. Nếu bạn theo dõi series tự học này, bạn sẽ biết và hiểu được thế nào là Biến(Variables), Hằng số(constants), hàm(functions)Closures. Bây giờ, đã đến lúc sử dụng những kiến thức đã học để áp dụng vào cấu trúc hướng đối tượng(object-oriented structures) của Class và Struct. Để hiểu được nội dung của bài hướng dẫn này, tôi khuyên bạn nên tìm hiểu trước về những kiến thức cơ bản về hướng đối tượng(Object-oriented programming – OOP), classes, objects, methods.

Giới thiệu

Trong phần này, chúng ta sẽ tìm hiểu về cách xây dựng các khối block {}, classes và structures trong Swift.  Trong Swift, Classes và Structures có cấu trúc và xử lý tương đối giống nhau, nhưng cũng có một số điểm khác nhau và chúng ta cần phải biết điều đó để tránh tạo ra những lỗi không đáng có trong Code cũng như code một cách hiểu quả nhất. Trong Objective-C, Classes và structures rất khác nhau, Tuy nhiên nó lại không đúng trong Swift, Trong Swift, cả hai classes và structures điều có properties và methods. Và nó lại khác với structure trong C, trong Swift có thể mở rộng(Extension) và kế thừa các Protocol. Vậy thì Classes và Structures trong Swift có những điểm khác nhau?. Chúng ta sẽ biết được câu trả lời ngay trong bài viết này.

Thuật ngữ cần hiểu

Trước khi bắt đầu tìm hiểu về Classes và Structures, Tôi muốn bạn hiểu một số thuật ngữ trong OPP, Thuật ngữ Classes, Objects và instances, nhiều người mới học thường nhầm lẫn các thuật ngữ này trong OPP. Vì thế, Nó cũng quan trọng bởi vì Swift cũng sử dụng các thuật ngữ này.

Objects and Instances.

Class là cách để khái báo và tạo ra một instances nào đó. Ví dụ: Ta có Class Person

var cafedevn = Person()

Ở đây ta sẽ gọi cafedevn là một instances của class Persion và gọi Person là một object, Instance là một thể hiện của một class còn Object thường dùng để nói về tên của class nào đó, ví dụ như, Class A thì người ta thường nói là Object A. Tuy nhiên, trong Swift, Classes và Structures tương đối giống nhau nên thường dùng chung thuật ngữ instance.

Methods và Functions.

Hiểu đơn giản thì Function là một hàm chứa các xử lý nào đó. Còn Methods là một Functions nhưng nó được viết trong một class hay structures nào đó.

Cách định nghĩa một Class

Chúng ta bắt đầu mở Xcode và tạo một playground và thêm code bên dưới:

class Person {
}

Từ khoá class dùng để định nghĩa một class với tên là Person

Properties

Thường thì một class sẽ có các properties và methods.

Lưu ý: var là cú pháp để khai báo một biến giá trị(trị của biến đó có thể thay đổi), let là cú pháp để khai báo một biến hằng(giá trị của biến đó sẽ không được thay đổi trong quá trình sử dụng) .

Methods

Chúng ta sẽ thêm các xử lý cho class Person bằng cách thêm các methods vào class như sau:

class Person {     
    var firstName: String?    
    var lastName: String?    
    let birthPlace = "Belgium"  
    
    func fullName() -> String { 
      var parts: [String] = []         
      if let firstName = self.firstName {            
          parts += [firstName]        
      }         
     if let lastName = self.lastName {        
     parts += [lastName]       
     }         
     return parts.joined(separator: " ")    
     }
}

Khởi tạo một Instantiation

Sau khi định nghĩa một class với một vài properties và methods. Sau đó chúng ta sẽ tạo một instance và sử dụng nó như sau:

let john = Person()
john.firstName = "John"
john.lastName = "Doe"

Hàm khởi tạo(Initialization) và Prameters

Chúng ta bắt đầu định nghĩa thêm các method khởi tạo mặc định hoặc method nhiều parameter như sau:

class Person {     
var firstName: String?    
var lastName: String?    
let birthPlace: String     
init() {        
   birthPlace = "France"    
}  

init(birthPlace: String) {  
  self.birthPlace = birthPlace
}

... 
}

let p1 = Person()
let p2 = Person(birthPlace: "France")

Định nghĩa Structures

Cách đinh nghĩa struct cũng tương tự như class, dưới đây là ví dụ cơ bản về định nghĩa một Struct:

struct Wallet {     
 var dollars: Int    
 var cents: Int 
}

Chỉ cần thay đổi từ khoá class thành struct là chúng ta có thể tạo mới một Struct.

Classes và Structures

Điểm giống:

  • Có chứa các properties, methods
  • Định nghĩa được Subscripts dùng để truy cập dữ liệu của đối tượng nhanh hơn.
  • Cho phép tạo và chỉnh sửa lại hàm khởi tạo
  • Cho phép kế thừa Protocol
  • Cho phép sử dụng Extension để mở rộng tính năng

Điểm khác nhau:

Class có những tính năng mà struct không có như:

  • Cho phép kế thừa từ class khác.
  • Các instance cho phép so sách được với nhau.
  • Cho phép huỷ một instance nào đó để giải phóng bộ nhớ.
  • Tăng reference counting khi có thêm một tham chiếu tới class.

Reference counting là cơ chế quản lý bộ nhớ trong Swift.

Lưu ý: Khi gán giá trị thì Struct luôn luôn copy ra một giá trị khác để gán và nó không có cơ chế reference couting.

Khi nào nên chọn dùng class hay struct.

Dùng struct khi thoãi mản một trong các điều kiện sau:

  • Tạo một dữ liệu đơn giản chứa trị đơn giản(các kiểu dữ liệu cơ sở như Int, String, Double…).
  • Dữ liệu đơn thuần chỉ có chứa các properties giá trị mà không cần phải dùng tham chiếu.
  • Chọn struct nếu không có nhu cầu kế thừa các Struct khác.

Còn các trường hợp còn lại thì nên dùng class.

Các bạn nên cân nhắc nhu cầu sử dụng trước khi chọn Struct hay class để dùng, Từ đó code của bạn mới tối ưu hoá và phát huy hết công dụng mà Struct và class hỗ trợ.

Đăng ký kênh youtube để ủng hộ Cafedev nha các bạn, Thanks you!