Swift là một trong những ngôn ngữ type-safe hàng đầu hiện nay. ???
Ờ đợt!! Type-safe language nghĩa là gì? ?
Ngôn ngữ type-safe luôn đảm bảo operation làm việc với đúng loại data có sẵn tại thời điểm đó.✓
Nếu ngôn ngữ có khả năng khai báo các kiểu data khác nhau (ví dụ: Int, Float, String, Array, Dictionary) và cũng có khả năng đảm bảo biến khai báo với kiểu data cụ thể sẽ không bao giờ giữ loại data khác, thì gọi là type-safe language.
Trong type-safe language, type checking luôn được thực hiện. Có thể xảy ra compile time hoặc run time tùy ngôn ngữ.✅
Generics trong Swift là gì??
Generics là type safe, giúp viết flexible, reusable functions và types. Dùng Generics, viết code làm việc cho tất cả data types. Vì Swift type-safe, không phá vỡ điều này mà viết generic code tránh duplicate code.
Ví dụ đơn giản: Array là ordered collection giữ cùng loại data. Vì thế trong định nghĩa Array, thấy nó nhận generic type Element. Do đó Array trở thành generic type của Collection.
Ok. Cool. Any type trong Swift là gì????
Swift cũng support Any type. Như tên gọi, nó represent instance của bất kỳ kiểu nào như struct, class, enum, function type.
Objective-C id và Swift Any giống nhau??
Swift 3, Objective C id type map sang Swift Any type. Cải thiện compatibility Swift và Objective C.
Nhưng tại sao và như thế nào??
Swift 2, Objective C id map sang Swift AnyObject. Hoạt động tốt hầu hết case, nhưng đôi khi gây unexpected behavior. Khái niệm quan trọng Swift là Value Types, mapping này không công bằng cho khái niệm này.
Swift mới cho iOS development, Objective C có từ nhiều năm. Dự án phần lớn viết Objective C. Convert project Objective C sang Swift, yêu cầu bridge bất kỳ Swift type nào sang bất kỳ Objective C object nào.
Không vấn đề với Swift class và value type như Int, String, Float vì đã có counterpart Objective C. Vấn đề nảy sinh cho Swift value type không có counterpart Objective C.
Để fix, Objective C id type map sang Swift Any type.✅✅✅
Đủ định nghĩa ?. Đến main topic. Theo điểm trên, Generics và Any type trông giống. Nhưng thực sự vậy???
Mức cao, Any có vẻ giống Generics. Thử tìm khác biệt-???
Chúng ta biết Stack trong Data Structures, đúng? Stack là linear data structure cơ bản insertion/deletion ở một đầu.
Triển khai Stack structure trong Swift. Trước dùng Generics, sau dùng Any type.
Triển Khai Stack Dùng Generics:
Stack implementation dùng Generics. Struct nhận generic type Element item triển khai stack dùng item đó. Làm operation với Generic Stack:
Khai báo Generic Stack giữ Integer element. Push integer element vào stack. Đến đây mọi thứ great.
Nhưng nếu muốn push float element lên genericStack trên?

❌❌ Oops! Compilation Error! ❌❌
Triển Khai Stack Dùng Any Type:
Stack Implementation này, items array giữ Any type element. Không specify kiểu data chính xác của element items array trong định nghĩa. Làm operation cơ bản trên stack này:
Không issue, đúng không? Mọi thứ fine. Khai báo stack push hai integer element. Gọi show() in mảng [3, 4].
Giờ push float value vào.☄️

✅✅ Không Error! Mọi thứ fine! ✅✅
Đằng sau diễn ra gì? Tại sao không error????
Generics nói với compiler:
Tôi khai báo generic type và sẽ cho bạn exact type sau. Tôi muốn bạn apply type đó mọi nơi tôi chỉ định.
Any type nói với compiler:
Đừng lo variable này, không cần apply type gì, để tôi làm gì tôi muốn.
Generics dùng define flexible functions, nhưng kiểu argument vẫn được compiler check. Any type dùng tránh type system của Swift.?
Trong generic stack declaration, báo compiler stack chỉ nhận integer type. Khi thử insert float type element, nghĩa là phá vỡ lời hứa. Nên throw compile time error. Luôn expect element là integer type.
Nhưng Any Stack, không compile time hay runtime error. Gọi show() in stack [3, 4, 5.0] nghĩa stack giữ integer và float. Vậy any stack không restriction type, push bất kỳ type value (nhưng có possibility runtime exception).
Kết Luận
Dùng Generics viết flexible functions, structures, classes, protocols không compromise Swift type safety. Dùng Any type, kiểu như tự do, làm gần như gì cũng được.
??? Cheers!!! Cảm ơn đã đọc!! ???