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 RequestType
sesuai 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 RequestType
entitas 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 RequestType
ketika 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 LegoRequestType
karena jika kita ingin frobulate
semuanya, kita tahu kita harus melewatkannya LegoModel
setiap saat.
Nuansa dengan Jenis Terkait ini membuat protokol apa pun yang menggunakannya menjadi istimewa. Perpustakaan Standar Swift memiliki Protokol seperti ini yang paling terkenal Collection
atau Sequence
.
Untuk memungkinkan Anda membuat larik hal-hal yang mengimplementasikan Collection
protokol 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.