Trước khi giới thiệu về Generic Protocol, mình tóm tắt và review 1 chút về Generic và protocol trong Swift

Generic

Generic được dùng khi muốn viết 1 hàm, biến , class hay params … 1 cách tổng quát nhất.
1 trong nhưng cách tạo Generic trong swift như sau:

struct GenericStruct<T> {
   var property: T?
}

<T> có thể được định nghĩa 1 cách rõ ràng hoặc để cho Swift infer dựa trên giá trị truyền vào.
Ví dụ:

let explictStruct = GenericStruct<Bool>() 
// T là Bool,  được định nghĩa 1 cách rõ ràng

let implicitStruct = GenericStruct(property: "String")
// T là String, được infer từ "String"

Protocol

Tạo 1 protocol đơn giản.

protocol NormalProtocol {
      var property: String { get set }
}

Class hay Struct comfort protocol này phải implement property như 1 string, và Type của property ko thể thay đổi đc.

class NormalClass: NormalProtocol {
       var property: String = "String 1"
}

Vấn đề đặt ra là, làm sao property của Class hay Struct comfort protocol có thể đc generic như sử dụng Generic phía trên.Nghĩa là property có thể là Int, Bool hay là String.
Để làm đc cái đó chung ta sẽ tìm hiểu về Protocol Associated Types

Associated Type

Để có thể generic property trong Protocol như Generic thì chúng ta tạo 1 kiểu giống như <T> như sau:

protocol GenericProtocol {
      associatedtype T
      var genericProperty: T { get set }
}

Giống như Generic bình thường, Class hay Struct comfort GenericProtocol có thể tự định nghĩa type của T hoặc để swift tự động infer

class GenericClass: GenericProtocol {
    typealias T = Int  // T là Int 
    var genericProperty = 1
}

class GenericClass: GenericProtocol {
    var genericProperty = "String"    // T tự hiểu là String
}