Class và Struct trong Swift

ClassStruct là những thành phần code chính trong hầu hết mọi ứng dụng iOS. Trong ngôn ngữ Objective-C, Class và Struct thật sự rất khác nhau. Tuy nhiên điều này không đúng đối với Swift. Bạn điều có thể khai báo thuộc tính, menthod trong class và struct. Trong Swift thì struct cũng hổ trợ thực hiện protocol.

Điểm giống nhau Class và Struct

  • Khai báo những thuộc tính (property) để lưu trữ giá trị, khai báo những phương thức (methods) để cung cấp chức năng và khai báo subscripts để cung cấp khả năng truy cập giá trị của chúng sử dụng cú pháp subcript.
  • Định nghĩa constructer (init) để khởi tạo giá trị ban đầu.
  • Mở rộng chức năng xa so với hiện thực mặc định ban đầu. (//4)
  • Hiện thực protocols để cung cấp những chức năng tiêu chuẩn của một loại hình nào đó.
struct Bird {
    var id: Int
    var name: String
    
    init(id: Int, name: String) {
        self.id = id
        self.name = name
    }
    
    func introduce() {
        print("I am \(name).")
    }
}

protocol Flyable {
    func fly()
}

extension Bird: Flyable { //4
    func fly() {
        print("I can fly.”)
    }
}

Điểm khác nhau Class và Struct

Class có những tính chất mà Struct không có:

1.Tính kế thừa ( Inheritance ):

class Vehicle {
    var manufacturer: String?
    let passengerCapacity: Int
    
    init(passengerCapacity: Int) {
        self.passengerCapacity = passengerCapacity
    }
}

class Car: Vehicle {
    var fuelType: String?
}

let car = Car(passengerCapacity: 4)

2. Kiểu tham chiếu và kiểu giá trị (Reference Types vs. Value Types):

  • let: hằng số, không thể thay đổi
  • var: biến số, có thể thay đổi
  • Value type (kiểu giá trị) ( struct, enum, string, int, Double, CGPoint, CGSize, CGFloat, Array, Dictionary ): là một kiểu mà giá trị của nó được copy khi nó được gán tới một biến hay một hằng, hoặc khi nó được truyền như thể là một parameter tới function.
struct Location {
    var longitude: Double
    var latitude: Double
    
    init(longitude: Double, latitude: Double) {
        self.longitude = longitude
        self.latitude = latitude
    }
}

var location1 = Location(longitude: 1.23, latitude: 1.23)
var location2 = location1

location1.longitude = 4.56

print(location1.longitude) //4.56
print(location2.longitude) //1.23
class Location {
    var longitude: Double
    var latitude: Double
    
    init(longitude: Double, latitude: Double) {
        self.longitude = longitude
        self.latitude = latitude
    }
}

var location1 = Location(longitude: 1.23, latitude: 1.23)
var location2 = location1

location1.longitude = 4.56

print(location1.longitude) //4.56
print(location2.longitude) //4.56
  • Reference type (kiểu tham chiếu) (class, UIView, UIViewController, UITableView,…, NSString, NSNumber, NSArray, and NSDictionary ): Bản chất là tham chiếu đến ô nhớ.

3. Toán tử đồng nhất thức (Identity Operators): để xác định 2 object có tham chiếu đến cùng một ô nhớ không.

4. Khi nào dùng Struct ?

  • Cấu trúc dữ liệu đơn giản, có ít thuộc tính.
  • Struct không cần thừa kế thuộc tính hay hành vi từ bất kì kiểu khác.
  • Bạn muốn dữ liệu sẽ được sao chép rêng biệt, không liên quan đến nhau.
  • Những thuộc tính được lưu trữ bởi struct thì bản thân nó là kiểu giá trị.
Class Struct
1 Reference type (kiểu tham chiếu) Value type (kiểu giá trị)
2 Có tính kế thừa: Kế thừa từ class khác, struct, …
3 Có thêm toán tử đồng nhất thức (===) để xác định 2 object có tham chiếu đến cùng một ô nhớ không
4 Có hàm deinit
Rate this post

You May Also Like

About the Author:

Leave a Reply

Your email address will not be published. Required fields are marked *