Swift 中的泛型

来源:互联网 发布:80端口入侵 编辑:程序博客网 时间:2024/06/04 18:07

Swift 泛型

  • 泛型的本质是参数化类型,也就是说所操作的数据类型被指定为一个参数,这种参数类型可以用在类型、函数、和方法中
  • 泛型能够让开发者编写自定义需求已经任意类型的灵活可用的的函数和类型。能够让我们避免重复的代码。用一种清晰和抽象的方式来表达代码的意图

泛型函数

定义一个交换两个值得泛型函数

func swapTwoValues<T>(_ a : inout T, _ b : inout T){    let temp = a    a = b    b = temp}var num1 = 11var num2 = 22swapTwoValues(&num1, &num2)print("num1: \(num1) -- num2: \(num2)")var str1 = "11"var str2 = "22"swapTwoValues(&str1, &str2)print("str1: \(str1) -- str2: \(str2)")

泛型类型

//定义一个泛型的栈

struct Stack<Element> {    var items = [Element]()    mutating func push(_ item : Element){        items.append(item)    }    mutating func pop() -> Element {        return items.removeLast()    }}

扩展泛型类型

extension Stack {    var topItem : Element? {        return items.isEmpty ? nil : items[items.count - 1]    }}var s = Stack<String>()s.push("1");print(s.topItem!)

类型约束

  • 默认情况下,泛型函数和泛型类型可以作用于任何类型,不过,有的时候需要对泛型=函数和泛型类型中的类型做一些强制约束

  • 类型约束可以指定一个类型参数必须继承自指定的类,或者符合一个特定协议或协议组合。可以在一个类型参数名后面放置一个类名或者协议名,通过冒号分割,从而定义类型约束。它们将作为类型参数列表的一部分

示例

 func 函数名<T:类名,U:协议名>(参数名称:T,参数名称2:U) {     //泛型函数的函数体部分 }

上述函数定义了有两个类型参数,第一个类型参数 T ,有一个T必须是某个类型的类型约束,第二个类型参数U,有一个U 必须符合某个协议的类型约束

关联类型

  • 在定义协议时,有时候需要对对协议遵守者的元素类型有要求,此时可以在协议内声明一个或者多个关联类型,关联类型可以理解为协议的泛型类型,关联类型提供了一个占位名
    ,其代表的实际类型在协议被采纳时才会被指定, 通过 associatedtype 关键字来指定关联类型
protocol Container {    associatedtype itemType    mutating func append(_ item : itemType)    // 获取容器中元素的数    var count: Int { get }    // 通过索引值类型为 Int 的下标检索到容器中的每一个元素    subscript(i: Int) -> itemType { get }}
struct Stack2<Element> : Container{    var items = [Element]()    mutating func push(_ item : Element){        items.append(item)    }    mutating func pop() -> Element {        return items.removeLast()    }    mutating func append(_ item: Element) {        self.push(item)    }    var count: Int {        return self.items.count    }    subscript(i: Int) -> Element {        return items[i]    }}

where 子语句

  • 为关联类型定义约束的方法就是在参数列表中添加 where 子句
  • 作用:where 子句能够使一个关联类型符合某个协议,或者要求某个类型参数必须与关联类型的类型相同 where 子句紧跟在类型参数列表后面
func allItemsMatch< C1: Container, C2: Container>(_ someContainer: C1,_ anotherContainer: C2) -> Bool where C1.itemType == C2.itemType, C1.itemType: Equatable {        if someContainer.count != anotherContainer.count {            return false        }        for i in 0..<someContainer.count {            if someContainer[i] != anotherContainer[i] {                return false            }        }       return true}var stackOfStrings = Stack2<String>()stackOfStrings.push("uno")stackOfStrings.push("dos")stackOfStrings.push("tres")var arrayOfStrings = Stack2<String>()arrayOfStrings.push("uno")arrayOfStrings.push("dos")arrayOfStrings.push("tres")if allItemsMatch(stackOfStrings, arrayOfStrings) {    print("所有元素匹配")} else {    print("所有元素不能匹配")}
原创粉丝点击
热门问题 老师的惩罚 人脸识别 我在镇武司摸鱼那些年 重生之率土为王 我在大康的咸鱼生活 盘龙之生命进化 天生仙种 凡人之先天五行 春回大明朝 姑娘不必设防,我是瞎子 淘宝申请退款后店铺关闭怎么办 宝贝详情怎么改不了怎么办 改详情页后被删除宝贝怎么办 淘宝网商贷生意不好还不了怎么办 英国遗失在酒店物品怎么办 班福法则首位是0怎么办 同事能力比你强怎么办 新买的木板床响怎么办 笔记本键盘驱动坏了怎么办 云柜快递超时了怎么办 毕业设计被老师发现抄的怎么办 地板颜色太深了怎么办 皮质鞋子破皮了怎么办 吃了蜘蛛丝会怎么办 南京高二分班不公平怎么办? 高中分班考试没考好怎么办 实木门上的伸缩缝太深怎么办 mac点关机没反应怎么办 被压倒扁的易拉罐怎么办 白色车漏底漆了怎么办 客厅对着卧室门怎么办 老公不上进还懒怎么办 二胡按弦手指分不开怎么办 酷塑做完后疼痛怎么办 冷冻治疗后水泡破了怎么办 冷冻治疗的水泡破了怎么办? 冷冻治疗水泡破了怎么办 脚上冷冻后起泡怎么办 刺猴冷冻后起泡怎么办 隔壁太吵怎么办阴招 楼上有小孩太吵怎么办 捷达小水管睹了怎么办 楼房下水管冻了怎么办 一楼地面很潮湿怎么办 新房子地面有裂缝怎么办 地砖下面的下水管漏水怎么办 速冻饺子冻在一起了怎么办 牛排泡水解冻了怎么办 饺子都粘一起了怎么办 把桃子放冷冻了怎么办 抖音小视频连不上网怎么办