33 Swift泛型的发展历史与泛型的概述

简介: Swift泛型的发展历史与泛型的概述

泛型的发展历史以及泛型的概述

image.png

C++ 泛型

image.png

  • 面对对象库
  • MFC
  • 模板库
  • STL
  • Boost

template vs generic

  • 模板是C++泛型编程的基础
  • 泛型更来指一种编程思想

为什么需要泛型

  • 下面swapTwoInts(_: _:)是一个标准的非泛型函数,用于交换两个Int值

image.png

  • 如果你想交换两个String值,或者两个Double值,你只能再写更多的函数,比如下面的swapTwoStrings(_: _:)和swapTwoDoubles(_: _:)函数

image.png

  • swapTwoInts(_: _:)、swapTwoStrings(_: _:)和swapTwoDoubles(_: _:)函数体是一样的。唯一的区别是它们接受值类型不同(Int、String和Double)


如何在Swift中定义泛型函数

泛型函数定义

  • 泛型函数可以用于任何类型。这里是上面提到的swapTwoInts(_: _:)函数的泛型版本,叫做swapTwoValue(_: _:)

image.png

类型形式参数

image.png

命名类型形式参数

image.png

如何在Swift中定义泛型类型

泛型类型

  • 除了泛型函数,Swift允许你定义自己的泛型类型。它们是可以用于任意类型的自定义类、结构体、枚举,和Array、Dictionary方式类型

image.png

image.png

泛型Stack

image.png

image.png

image.png

扩展泛型类型

  • 当你扩展一个泛型类型时,不需要在扩展的定义中提供类型形式参数列表。原始类型定义的类型形式参数列表在扩展体里仍然有效,并且原始类型形式参数列表名称也用于扩展类型形式参数

image.png

Swift泛型中的类型约束

类型约束

image.png

类型约束语法

  • 在一个类型形式参数名称后面放置一个类或者协议作为形式参数列表的一部分,并用冒号隔开,以写出一个类型的约束。下面展示了一个泛型函数类型约束的基本语法(和泛型类型的语法相同)

image.png

类型约束的应用

  • 这是一个叫做findIndex(ofString:in:)的非泛型函数,在给定的String值数组中查找给定的String值。findIndex(ofString:in:)函数返回一个可选的Int值,如果找到了给定字符串,它会返回数组中第一个匹配的字符串的索引值,如果找不到给定字符串就返回nil

image.png

这里写出了一个叫做findIndex(of:in:)的函数,可能是你期望的findIndex(ofString:in:)函数的一个泛型版本。注意,函数的返回值仍然是Int?, 因为函数返回一个可选的索引数字,而不是数组里的一个可选的值。这个函数没有编译

image.png

  • Swift标准库中定义了一个叫做Equatable的协议,要求遵循其协议的类型要实现相等操作符(==)和不等操作符(!=),用于比较该类型的任意两个值。所有Swift标准库中的类型自动支持Equatable协议
  • 任何Equatable的类型都能安全地用于findIndex(of:in:)函数,因为可以保证那些类型支持相等操作符。为了表达这个事实,当你定义函数时将Equatable类型约束作为类型形式参数定义的一部分书写

image.png

















目录
相关文章
|
4月前
|
存储 安全 Swift
Swift 语言:什么是 Swift 的泛型(Generics)?
Swift 语言:什么是 Swift 的泛型(Generics)?
36 0
|
Swift
Swift实用小册21: Generics泛型的使用
在本章中,你将学会Generics泛型的使用方法。
149 0
Swift实用小册21: Generics泛型的使用
|
存储 编译器
Swift-进阶 14:泛型
Swift-进阶 14:泛型
200 0
|
Swift
Swift专题讲解二十二——泛型
Swift专题讲解二十二——泛型
95 0
|
Swift
Swift中的泛型语法实践
先来简单的, 由浅入深嘛。
1353 0
|
存储
Swift 2 中为实存类型和泛型搭桥牵线
本文讲的是Swift 2 中为实存类型和泛型搭桥牵线,我们又回到了讨论泛型的另一个章节,来讨论泛型,有其他类型的协议和在 Swift 2 中的其他类型的系统限制。这次我们会深入讨论一个有趣的变通方法,它是那个声名狼藉的 jckarter 教会我的。
1038 0