Mộc Viên's Blog Mộc Viên's Blog
Làm thế nào để sử dụng Self trong protocol?

Làm thế nào để sử dụng Self trong protocol?

Ngày đăng:

Làm thế nào để sử dụng Self trong protocol?

Trong Swift, Self trong protocol có thể được sử dụng để tham chiếu đến kiểu dữ liệu của chính đối tượng đang tuân theo protocol. Có ba cách phổ biến sử dụng Self trong protocol:


1. Self như một ràng buộc kiểu trả về

Khi bạn muốn một method trong protocol trả về chính kiểu của nó, bạn sử dụng Self để đảm bảo rằng kiểu trả về là một thực thể của kiểu đang tuân theo protocol.

Ví dụ:

protocol Copyable {
    func copy() -> Self
}

class Document: Copyable {
    var content: String
    
    init(content: String) {
        self.content = content
    }
    
    func copy() -> Self {
        return type(of: self).init(content: self.content)
    }
}

let doc1 = Document(content: "Hello")
let doc2 = doc1.copy() // doc2 có kiểu Document

Ở đây, copy() trả về Self, nghĩa là nó trả về một thể hiện của lớp kế thừa Copyable.


Cách sử dụng associatedtype trong protocol?
Trong Swift, associatedtype được sử dụng trong protocol để định nghĩa một kiểu dữ liệu liên kết (associated type), giúp protocol trở nên linh hoạt hơn mà không cần chỉ định trước một kiểu dữ liệu cụ thể. Mở rộng Giao thức trong Swift 6.0: Những Thủ Thuật MớiBài

2. Self như một kiểu ràng buộc

Khi bạn muốn giới hạn các kiểu dữ liệu có thể sử dụng trong protocol extension, bạn có thể dùng Self để ràng buộc.

Ví dụ:

protocol Configurable {
    associatedtype ConfigType
    func configure(with config: ConfigType) -> Self
}

class Button: Configurable {
    var title: String = ""
    
    func configure(with config: String) -> Self {
        self.title = config
        return self
    }
}

let button = Button().configure(with: "Click Me")
print(button.title) // "Click Me"

Ở đây, configure(with:) trả về Self, giúp hỗ trợ phương pháp chaining.


3. Self như một giới hạn kiểu trong associatedtype

Khi sử dụng associatedtype trong protocol, Self có thể được sử dụng để đảm bảo kiểu dữ liệu phù hợp với kiểu hiện tại.

Ví dụ:

protocol EquatableSelf {
    func isEqual(to other: Self) -> Bool
}

struct User: EquatableSelf {
    var id: Int
    
    func isEqual(to other: User) -> Bool {
        return self.id == other.id
    }
}

let user1 = User(id: 1)
let user2 = User(id: 2)
print(user1.isEqual(to: user2)) // false

Ở đây, isEqual(to:) yêu cầu other phải cùng kiểu với Self, giúp đảm bảo tính toàn vẹn kiểu dữ liệu.


Tóm tắt

  • Self dùng làm kiểu trả về giúp hỗ trợ phương pháp chaining.
  • Self giúp ràng buộc kiểu trong protocol extension.
  • Self giúp đảm bảo rằng các kiểu tuân theo protocol có thể sử dụng chính kiểu của chúng trong phương thức.
Swift 6.0 Actors: Tạm biệt Tình trạng Race Conditions!
Bài viết gốc bởi Adi Mizrahi, đăng trên CodeX, ngày 8 tháng 1 năm 2025. Chào các tín đồ Swift! Nếu bạn giống tôi, bạn luôn tìm kiếm cách để làm cho mã của mình sạch hơn, an toàn hơn và — hãy thừa nhận đi — thú vị hơn một chút

Gần đây