Generic Protocols Swift
Bài đăng này đã không được cập nhật trong 6 năm
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
}
All rights reserved