前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >22.Swift学习之泛型

22.Swift学习之泛型

作者头像
YungFan
发布2018-11-21 18:15:21
4130
发布2018-11-21 18:15:21
举报
文章被收录于专栏:学海无涯学海无涯
泛型
  • 一个案例引发的思考
代码语言:javascript
复制
func swapTwoInts(_ a: inout Int, _ b: inout Int) {
    let temporaryA = a
    a = b
    b = temporaryA
}


var oneInt = 3
var twoInt = 4
swapTwoInts(&oneInt, &twoInt)
print(oneInt,twoInt)

如果此时我们想交换两个Double类型、或者是其他类型的值,就需要针对不同的类型写类似的方法,但是这些方法仅仅只是参数类型不同。如何解决?—— 泛型

代码语言:javascript
复制
//泛型函数
func swapTwoValues<T>(_ a: inout T, _ b: inout T) {
    let temporaryA = a
    a = b
    b = temporaryA
}


var oneInt = 3
var twoInt = 4
swapTwoValues(&oneInt, &twoInt)
print(oneInt,twoInt)

var oneStr = "hello"
var twoStr = "world"
swapTwoValues(&oneStr, &twoStr)
print("oneStr:\(oneStr),twoStr:\(twoStr)")

var oneDouble = 10.01
var twoDouble = 20.02
swapTwoValues(&oneDouble, &twoDouble)
print("oneDouble:\(oneDouble),twoDouble:\(twoDouble)")
类型参数

类型参数指定并命名一个占位符类型,并用<>包裹,放在函数名后面,如上面例子中的 T。可以用它来指定参数类型,或者返回值的类型。在真正调用的时候会被实际的类型替代,如传递的是Int,就替换为Int,如果传入的是Double类型就替换为Double等等

类型约束
  • 上面的swapTwoValues(_:_:)函数可以用于任意类型。但是,有时在用于泛型函数需要遵循特定的类型。
  • 类型约束指出一个类型形式参数必须继承自特定类,或者遵循一个特定的协议、组合协议。
  • 语法
代码语言:javascript
复制
func someFunction<T: SomeClass, U: SomeProtocol>(someT: T, someU: U) {
}
关联类型
  • 关联类型通过 associatedtype 关键字指定
  • Element 起到了占位符的作用,指示了某种类型
  • 在实现的时候不能直接用 Element
  • Element 在遵守协议中协议方法中明确泛型的类型
代码语言:javascript
复制
protocol SomeProtocol {

    associatedtype Element
    
    func method1(element: Element)
    func method2(element: Element)
}



struct TestStruct: SomeProtocol {
    
    func method1(element: String) {
        print("method1: \(element)")
    }
    
    func method2(element: String) {
        print("method2: \(element)")
    }
}
TestStruct().method1(element: "Hello")  
TestStruct().method2(element: "World")
给关联类型添加约束
代码语言:javascript
复制
//要遵循这个版本的 Container ,容器的 Item 必须遵循 Equatable 协议
protocol SomeProtocol {

    associatedtype Element: Equatable
    
    func method1(element: Element)
    func method2(element: Element)
}
泛型where分句
  • 泛型 where 分句能够要求一个关联类型必须遵循指定的协议,或者指定的类型形式参数和关联类型必须相同
  • 泛型 where 分句以 where 关键字开头
代码语言:javascript
复制
protocol SomeProtocol {
    func say()
}

struct Bird: SomeProtocol {  
    func say() {
        print("Hello")
    }
    
}

func genericFunc<T>(num: T) where T: SomeProtocol {
    print(num)
}

genericFunc(num: Bird())
本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
原始发表:2018.11.20 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 泛型
  • 类型参数
  • 类型约束
  • 关联类型
  • 给关联类型添加约束
  • 泛型where分句
相关产品与服务
容器服务
腾讯云容器服务(Tencent Kubernetes Engine, TKE)基于原生 kubernetes 提供以容器为核心的、高度可扩展的高性能容器管理服务,覆盖 Serverless、边缘计算、分布式云等多种业务部署场景,业内首创单个集群兼容多种计算节点的容器资源管理模式。同时产品作为云原生 Finops 领先布道者,主导开源项目Crane,全面助力客户实现资源优化、成本控制。
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档