[Swift] Extensions

by Hoang Anh Tuan
643 views

Extensions – có tác dung đúng như tên gọi của nó, là dùng để mở rộng những class, struct, enum hoặc protocol đã được define.
Nó cho phép bạn mở rộng cả những class, struct mà bạn không có quyền truy cập để sửa source code như Int, String,.. hay UICollectionView, UITableView,…
Bài viết này sẽ nói về extensions trong swift và những cách sử dụng căn bản.

Content

  • Extension syntax
  • Initializes
  • Methods
  • Conform to protocol, delegate

Extension syntax:

Khai báo extensions với extension keyword:

extension SomeType {
    // new functionality to add to SomeType goes here
}

Công dụng của extension:

  • Add thêm các property, computed property.
  • Add thêm các methods.
  • Cung cấp các initializers mới.
  • Định nghĩa subscripts
  • Định nghĩa và sử dụng các nested type
  • Extend 1 class để làm class đó conform các protocol, delegate.

Initialize:

  • Extension có thể dùng để thêm các initialize mới cho các kiểu dữ liệu đã được define.
  • Đối với class, ở extension thì chỉ có thể thêm các convenience init mới, không được thêm các init hoặc deinit:
designated init và deinit không được đặt tại extension của 1 class
  • Đối với struct thì có thể thêm các init, deinit vào extension:

Methods:

  • Sử dụng extension để thêm các func mới cho 1 existing type:
class Human {
    func eat() {
        print("Eating")
    }
}

extension Human {
    func play() {
        print("Playing")
    }
    
    func sleep() {
        print("Sleeping")
    }
}

let me = Human()
me.eat()
me.play()
me.sleep()
  • Đối với value type như struct và enum, nếu func được thêm vào mà làm thay đổi giá trị của property của struct, enum thì func đó phải được define là mutating.
    Ở ví dụ dưới đây, vì func changeName thay đổi property name, nên func đó phải đc define là mutating bằng cách thêm mutating keyword vào đằng trước func.
struct Dog {
    var name: String
}

extension Dog {
    mutating func changeName(newName: String) {
        self.name = newName
    }
}
  • Có thể dùng extension để add thêm các func cho những source code mà bạn không được truy cập đến:

Ở đây, bạn add thêm 1 func square để tính gía trị bình phương cho struct Int.
Vì vậy, bất cứ 1 instance nào có kiểu dữ liệu là Int đều có func square mà bạn add thêm.

Conform to protocol, delegate

  • 1 công dụng nữa của extension là extend 1 class để làm cho class đó conform 1 protocol, delegate:

Thông thường, có thể làm 1 class conform protocol bằng cách viết:

class AController: UIViewController, UICollectionViewDataSource. UICollectionViewDelegate {

}

Hoặc sử dụng extension:

class AController: UIViewController {

}

// MARK: - UICollectionViewDataSource
extension AController: UICollectionViewDataSource {

}

// MARK: - UICollectionViewDelegate
extension AController: UICollectionViewDelegate {

}

Note: Nên tách ra thành nhiều extension khi extend 1 class để làm class đó conform protocol, delegate để clear và dễ dàng đọc code hơn.

Kết luận:

  • Dùng extension để làm cho source code dễ đọc và clear hơn.
  • Dùng extension để add thêm các func cho những class như ViewController, TableView, … hoặc struct như Int, String,… để có thể tái sử dụng, tránh duplicate code.

Ngoài ra, extension còn dùng để add thêm các nested type, các subscrip, cách làm cũng tương tự như khi add thêm method, property.

Có thể tham khảm thêm tại: https://docs.swift.org/swift-book/LanguageGuide/Extensions.html

Leave a Comment

* By using this form you agree with the storage and handling of your data by this website.