22.Swift学习之泛型

泛型

  • 一个案例引发的思考
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类型、或者是其他类型的值,就需要针对不同的类型写类似的方法,但是这些方法仅仅只是参数类型不同。如何解决?—— 泛型

//泛型函数
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(_:_:)函数可以用于任意类型。但是,有时在用于泛型函数需要遵循特定的类型。
  • 类型约束指出一个类型形式参数必须继承自特定类,或者遵循一个特定的协议、组合协议。
  • 语法
func someFunction<T: SomeClass, U: SomeProtocol>(someT: T, someU: U) {
}

关联类型

  • 关联类型通过 associatedtype 关键字指定
  • Element 起到了占位符的作用,指示了某种类型
  • 在实现的时候不能直接用 Element
  • Element 在遵守协议中协议方法中明确泛型的类型
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")

给关联类型添加约束

//要遵循这个版本的 Container ,容器的 Item 必须遵循 Equatable 协议
protocol SomeProtocol {

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

泛型where分句

  • 泛型 where 分句能够要求一个关联类型必须遵循指定的协议,或者指定的类型形式参数和关联类型必须相同
  • 泛型 where 分句以 where 关键字开头
protocol SomeProtocol {
    func say()
}

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

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

genericFunc(num: Bird())

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏owent

POJ 3267 The Cow Lexicon 解题报告

1.可以令 deleteNum[pos]为输入字符串在pos处需要删除的最少字符数量;

8320
来自专栏行者常至

abstract 不可以 与final , private , static 共存

7620
来自专栏codingforever

经典算法巡礼(一) -- 排序之冒泡排序

事实上,她重复地遍历需要排序的元素,一次比较相邻的两个元素,如果不满足预先定义的比较条件,则交换;否则继续下一组元素比较,直至遍历完成需要排序的所有元素。当然,...

4520
来自专栏Jackson0714

【.Net底层剖析】2.stfld指令-给对象的字段赋值

30360
来自专栏前端布道

JavaScript之正则表达式

正则表达式 (regular expression) 描述了一种字符串匹配的模式(pattern),可以用来检查一个串是否含有某种子串、将匹配的子串替换或者从某...

29560
来自专栏石奈子的Java之路

原 java数据结构与算法之数组篇

21640
来自专栏鸿的学习笔记

一句话讲明白基本排序

4820
来自专栏Bingo的深度学习杂货店

Q189 Rotate Array

Rotate an array of n elements to the right by k steps. For example, with n = 7 a...

37870
来自专栏老司机的技术博客

golang学习笔记4:基本类型和运算符

布尔型的值只可以是常量 true 或者 false。一个简单的例子: var b bool = true 。两个类型相同的值可以使用相等 == 或者不等 != ...

31030
来自专栏Bug生活2048

Python自学之路-内置函数说明及实例(二)

这有利于组织代码,把某些应该属于某个类的函数给放到那个类里去,同时有利于命名空间的整洁。

15610

扫码关注云+社区

领取腾讯云代金券