網站首頁 編程語言 正文
泛型(Generics)
1、泛型可以將類型參數化,提高代碼復用率,減少代碼量
func swapValue<T>(_ a: inout T, _ b: inout T) -> Void {
(a, b) = (b, a)
}
var fn: (inout Int, inout Int) -> () = swapValue
棧
class Stack<E> {
var elements = [E]()
func push(_ element: E) -> Void {
elements.append(element)
}
func pop() -> E {
elements.removeLast()
}
func top() -> E {
elements.last!
}
func size() -> Int {
elements.count
}
}
var intStack = Stack<Int>()
var stringStack = Stack<String>()
var anyStack = Stack<Any>()
class SubStack<E>: Stack<E> {
}
struct Stack<E> {
var elements = [E]()
mutating func push(_ element: E) {
elements.append(element)
}
mutating func pop() -> E {
elements.removeLast()
}
func top() -> E {
elements.last!
}
func size() -> Int {
elements.count
}
}
匯編分析泛型的實現原理
通過匯編我們可以看到兩次調用的swapValues方法的地址是相同的,也就是說是相同的方法,匯編中有關于metadata的信息,所以推測Swift中的泛型是通過對元數據的處理實現的。
關聯類型(Associated Type)
1、關聯類型的作用:給協議中用到的類型定義一個占位名稱
2、協議中可以擁有多個關聯類型
protocol Stackable {
associatedtype Element
mutating func push(_ element: Element)
mutating func pop() -> Element
func top() -> Element
func size() -> Int
}
class StringStack: Stackable {
// typealias Element = String 可寫可不寫
var elements = [String]()
func push(_ element: String) -> Void {
elements.append(element)
}
func pop() -> String {
elements.removeLast()
}
func top() -> String {
elements.last!
}
func size() -> Int {
elements.count
}
}
類型約束
protocol Runnable {}
class Person {}
func swapValues<T: Person & Runnable>(_ a: inout T, _ b: inout T) -> Void {
(a, b) = (b, a)
}
更多的約束
func equal<S1: Stackable, S2: Stackable>(_ s1: S1, _ s2: S2) -> Bool
where S1.Element == S2.Element, S1.Element: Hashable
{
return false
}
協議類型的注意點
protocol Runnable {}
class Person: Runnable {}
class Car: Runnable {}
func getObject(_ type: Int) -> Runnable {
if type == 0 {
return Person()
}
return Car()
}
var r1 = getObject(0)
var r2 = getObject(1)
1、如果協議中有associatedtype,那么會有類型識別不了的問題,以下代碼會報錯
protocol Runnable {
associatedtype Speed
var speed: Speed {
get
}
}
class Person: Runnable {
var speed: Double {
0.0
}
}
class Car: Runnable {
var speed: Int {
0
}
}
func getObject(_ type: Int) -> Runnable {
if type == 0 {
return Person()
}
return Car()
}
泛型解決
解決方案1:使用泛型
protocol Runnable {
associatedtype Speed
var speed: Speed {
get
}
}
class Person: Runnable {
var speed: Double {
0.0
}
}
class Car: Runnable {
var speed: Int {
0
}
}
func getObject<T: Runnable>(_ type: Int) -> T {
if type == 0 {
return Person() as! T
}
return Car() as! T
}
var r1: Person = getObject(0)
var r2: Car = getObject(1)
不透明類型(Opaque Type)
1、解決方案2:使用some關鍵字聲明一個不透明類型
func getObject(_ type: Int) -> some Runnable {
return Car()
}
2、some限制只能返回一種類型
some
1、some除了用在返回值類型上,一般還可以用在屬性類型上
protocol Runnable {
associatedtype Speed
}
class Dog: Runnable {
typealias Speed = Double
}
class Person {
var pet: some Runnable {
return Dog()
}
}
原文鏈接:https://blog.csdn.net/run_in_road/article/details/126247241
相關推薦
- 2021-12-24 OpenCV?reshape函數實現矩陣元素序列化_C 語言
- 2022-12-14 Flutter應用框架搭建實現屏幕適配方案詳解_Android
- 2022-12-04 .NET?Core利用BsonDocumentProjectionDefinition和Lookup
- 2022-11-16 常用的Git便捷操作合集_相關技巧
- 2024-01-10 CloneNotSupportedException的解決方案 + Object的clone方法分析
- 2022-05-01 Python類的常用高級函數匯總_python
- 2023-08-15 (el-Form)操作(不使用 ts):Element-plus 中 Form 表單組件校驗規則等的
- 2022-08-21 Python中條件語句、循環語句和pass語句的使用示例_python
- 最近更新
-
- window11 系統安裝 yarn
- 超詳細win安裝深度學習環境2025年最新版(
- Linux 中運行的top命令 怎么退出?
- MySQL 中decimal 的用法? 存儲小
- get 、set 、toString 方法的使
- @Resource和 @Autowired注解
- Java基礎操作-- 運算符,流程控制 Flo
- 1. Int 和Integer 的區別,Jav
- spring @retryable不生效的一種
- Spring Security之認證信息的處理
- Spring Security之認證過濾器
- Spring Security概述快速入門
- Spring Security之配置體系
- 【SpringBoot】SpringCache
- Spring Security之基于方法配置權
- redisson分布式鎖中waittime的設
- maven:解決release錯誤:Artif
- restTemplate使用總結
- Spring Security之安全異常處理
- MybatisPlus優雅實現加密?
- Spring ioc容器與Bean的生命周期。
- 【探索SpringCloud】服務發現-Nac
- Spring Security之基于HttpR
- Redis 底層數據結構-簡單動態字符串(SD
- arthas操作spring被代理目標對象命令
- Spring中的單例模式應用詳解
- 聊聊消息隊列,發送消息的4種方式
- bootspring第三方資源配置管理
- GIT同步修改后的遠程分支