Giả sử hiện tại chúng tôi điều chỉnh giao thức của bạn để thêm một quy trình sử dụng loại được liên kết:
public protocol RequestType: class {
associatedtype Model
var path: String { get set }
func frobulateModel(aModel: Model)
}
Và Swift cho phép bạn tạo ra một mảng RequestType
theo cách bạn muốn. Tôi có thể chuyển một mảng các loại yêu cầu đó vào một hàm:
func handleQueueOfRequests(queue: [RequestType]) {
for request in queue {
request.frobulateModel()
}
}
Tôi suy sụp đến mức muốn đóng băng tất cả mọi thứ, nhưng tôi cần biết loại đối số nào để chuyển vào cuộc gọi. Một số RequestType
thực thể của tôi có thể lấy a LegoModel
, một số có thể lấy a PlasticModel
và những thực thể khác có thể lấy a PeanutButterAndPeepsModel
. Swift không hài lòng với sự mơ hồ vì vậy nó sẽ không cho phép bạn khai báo một biến của giao thức có kiểu liên kết.
Đồng thời, nó có ý nghĩa hoàn hảo, chẳng hạn như tạo một mảng RequestType
khi chúng ta BIẾT rằng tất cả chúng đều sử dụng LegoModel
. Điều này có vẻ hợp lý, và đúng là như vậy, nhưng bạn cần một số cách để thể hiện điều đó.
Một cách để làm điều đó là tạo một lớp (hoặc struct, hoặc enum) liên kết một kiểu thực với tên kiểu Mô hình trừu tượng:
class LegoRequestType: RequestType {
typealias Model = LegoModel
}
Bây giờ hoàn toàn hợp lý khi khai báo một mảng LegoRequestType
bởi vì nếu chúng ta muốn frobulate
tất cả chúng, chúng ta biết rằng chúng ta sẽ phải vượt qua LegoModel
mỗi lần.
Sắc thái này với các Loại liên kết làm cho bất kỳ giao thức nào sử dụng chúng trở nên đặc biệt. Các Swift thư viện chuẩn có giao thức như thế này đáng chú ý nhất Collection
hoặc Sequence
.
Để cho phép bạn tạo một mảng những thứ triển khai Collection
giao thức hoặc một tập hợp những thứ triển khai giao thức trình tự, Thư viện Chuẩn sử dụng một kỹ thuật được gọi là "type-erasure" để tạo các kiểu struct AnyCollection<T>
hoặc AnySequence<T>
. Kỹ thuật xóa kiểu chữ khá phức tạp để giải thích trong câu trả lời Stack Overflow, nhưng nếu bạn tìm kiếm trên web sẽ có rất nhiều bài viết về nó.
Tôi có thể đề xuất một video từ Alex Gallagher về Giao thức với các loại được liên kết (PATs) trên YouTube.