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
.

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 trongprotocol 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.
