Misalkan untuk saat ini kami menyesuaikan protokol Anda untuk menambahkan rutinitas yang menggunakan tipe terkait:
public protocol RequestType: class {
associatedtype Model
var path: String { get set }
func frobulateModel(aModel: Model)
}
Dan Swift mengizinkan Anda membuat larik RequestTypesesuai keinginan Anda. Saya bisa melewatkan berbagai jenis permintaan tersebut ke dalam sebuah fungsi:
func handleQueueOfRequests(queue: [RequestType]) {
for request in queue {
request.frobulateModel()
}
}
Saya sampai pada titik bahwa saya ingin mengacaukan semua hal, tetapi saya perlu tahu jenis argumen apa yang harus dimasukkan ke dalam panggilan. Beberapa RequestTypeentitas saya dapat mengambil LegoModel, beberapa dapat mengambil PlasticModel, dan lainnya dapat mengambil PeanutButterAndPeepsModel. Swift tidak senang dengan ambiguitas tersebut sehingga tidak akan membiarkan Anda mendeklarasikan variabel protokol yang memiliki tipe terkait.
Pada saat yang sama, sangat masuk akal untuk, misalnya, membuat larik RequestTypeketika kita TAHU bahwa semuanya menggunakan LegoModel. Ini tampaknya masuk akal, dan memang demikian, tetapi Anda memerlukan cara untuk mengungkapkannya.
Salah satu cara untuk melakukannya adalah dengan membuat kelas (atau struct, atau enum) yang mengaitkan tipe nyata dengan nama tipe Model abstrak:
class LegoRequestType: RequestType {
typealias Model = LegoModel
}
Sekarang sepenuhnya masuk akal untuk mendeklarasikan sebuah array LegoRequestTypekarena jika kita ingin frobulatesemuanya, kita tahu kita harus melewatkannya LegoModelsetiap saat.
Nuansa dengan Jenis Terkait ini membuat protokol apa pun yang menggunakannya menjadi istimewa. Perpustakaan Standar Swift memiliki Protokol seperti ini yang paling terkenal Collectionatau Sequence.
Untuk memungkinkan Anda membuat larik hal-hal yang mengimplementasikan Collectionprotokol atau sekumpulan hal-hal yang mengimplementasikan protokol sekuens, Perpustakaan Standar menggunakan teknik yang disebut "jenis-penghapusan" untuk membuat jenis struktur AnyCollection<T>atau AnySequence<T>. Teknik penghapusan jenis agak rumit untuk dijelaskan dalam jawaban Stack Overflow, tetapi jika Anda menelusuri web, ada banyak artikel tentangnya.
Saya dapat merekomendasikan video dari Alex Gallagher tentang Protocols With Associated Types (PATs) di YouTube.