openplanning

Lớp và đối tượng trong Swift

  1. Class đầu tiên của bạn
  2. Quy tắc gọi Constructor
  3. Toán tử so sánh đối tượng

1. Class đầu tiên của bạn

Swift là một ngôn ngữ kế thừa ngôn ngữ CObjective-C, nó vừa là một ngôn ngữ hướng thủ tục, vừa là một ngôn ngữ hướng đối tượng. Lớp (Class) chính là một khái niệm của các ngôn ngữ lập trình hướng đối tượng. Lớp có các thuộc tính và các phương thức, về bản chất phương thức (method) được hiểu là một hàm của lớp. Từ một lớp bạn có thể tạo ra các đối tượng.
Swift sử dụng từ khóa class để khai báo một lớp.
Tạo một file nguồn Rectangle.swift:
Rectangle.swift
import Foundation 

class Rectangle  { 
    // width property
    var width: Int = 5; 
    // height property
    var height: Int = 10;
    
    // Constructor mặc định (Không tham số)
    // (Được sử dụng để tạo ra đối tượng)
    init()  {
        
    } 
    // Một Constructor có 2 tham số.
    // (Được sử dụng để tạo ra đối tượng)
    // self.width trỏ tới thuộc tính (property) width của lớp.
    init (width: Int, height: Int)  {
        self.width = width
        self.height = height
        
    } 
    // Phương thức dùng để tính diện tích hình chữ nhật.
    func getArea()  -> Int  { 
        var area = self.width * self.height
        return area
    } 
}
Đoạn code sử dụng lớp Rectangle để tạo ra các đối tượng.
RectangleTest.swift
import Foundation 

func test_rectangle()  { 
    print("Create a Rectangle rec1"); 
    // Tạo một đối tượng Rectangle
    // thông qua Constructor mặc định: init()
    var rec1  = Rectangle() 
    
    // In ra width, height.
    print("rec1.width = \(rec1.width)")
    print("rec1.height = \(rec1.height)")
    
    // Gọi phương thức để tính diện tích.
    var area1 = rec1.getArea() 
    print("area1 = \(area1)") 
    print("---------") 
    print("Create a Rectangle rec2");
    
    // Tạo đối tượng Rectangle
    // thông qua Constructor có 2 tham số: init(Int,Int)
    var rec2 = Rectangle(width: 10, height: 15) 
    
    // In ra width, height.
    print("rec2.width = \(rec2.width)")
    print("rec2.height = \(rec2.height)") 
    // Gọi phương thức để tính diện tích.
    var area2 = rec2.getArea() 
    print("area2 = \(area2)") 
}
Sửa file main.swift để test ví dụ:
main.swift
import Foundation

test_rectangle()
Chạy ví dụ:
Create a Rectangle rec1
rec1.width = 5
rec1.height = 10
area1 = 50
----------
Create a Rectangle rec2
rec2.width = 10
rec3.height = 15
area2 = 150
Bây giờ bạn cần xem các giải thích về lớp, nó vô cùng quan trọng.
Điều gì xẩy ra khi bạn tạo một đối tượng theo phương thức tạo đối tượng mặc định (default constructor)?
Tạo đối tượng Rectangle bằng phương thức tạo đối tượng 2 tham số.

2. Quy tắc gọi Constructor

Quy tắc Swift 2.1 gọi hàm (function), phương thức (method), và phương thức khởi tạo (constructor):
  • Tham số đầu tiên truyền cho hàm (hoặc phương thức) không yêu cầu nhãn tham số (Label)
  • Các tham số khác truyền cho hàm (hoặc phương thức) yêu cầu phải có nhãn tham số.
  • Tất cả các tham số truyền vào cho Constructor yêu cầu phải có nhãn tham số (Label)

3. Toán tử so sánh đối tượng

Trong Swift, khi bạn tạo một đối tượng thông qua phương thức khởi tạo (Constructor) sẽ có một thực thể thực sự được tạo ra nằm trên bộ nhớ, nó có một địa chỉ xác định.

Một phép toán gán đối tượng AA bởi một đối tượng BB không tạo ra thêm thực thể trên bộ nhớ, nó chỉ là trỏ địa chỉ của AA tới địa chỉ của BB.
Toán tử === dùng để so sánh địa chỉ 2 đối tượng trỏ đến, nó trả về true nếu cả 2 đối tượng cùng trỏ tới cùng một địa chỉ trên bộ nhớ. Toán tử !== cũng sử dụng để so sánh 2 địa chỉ của 2 đối tượng trỏ đến, nó trả về true nếu 2 đối tượng trỏ tới 2 địa chỉ khác nhau.
IdentifyOperator.swift
import Foundation


func identifyOperator()    {
    
    // Tạo đối tượng: r1
    var r1 = Rectangle(width: 20,height: 10)
    
    // Tạo đối tượng: r2
    var r2 = Rectangle(width: 20,height: 10)
    
    var r3 = r1
    
    
    var  b12:Bool =   r1 === r2
    var  b13:Bool =   r1 === r3
    
    print("r1 === r2 ?  \(b12)") // false
    print("r1 === r3 ?  \(b13)") // true
    
    
    var bb12: Bool = r1 !== r2
    var bb13: Bool = r1 !== r3
    
    
    print("r1 !== r2 ?  \(b12)") // true
    print("r1 !== r3 ?  \(b13)") // false
    
}
Chạy ví dụ:
r1 === r2 ? false
r1 === r3 ? true
r1 !== r2 ? false
r1 !== r3 ? true