Swift-泛型
发布日期:2022-03-18 08:27:40 浏览次数:33 分类:技术文章

本文共 2510 字,大约阅读时间需要 8 分钟。

Swift-泛型

参考:

Swift 的 ArrayDictionary 都是泛型集合

泛型函数

如下的函数pairsFromDictionary

func pairsFromDictionary
(dictionary: [KeyType: ValueType]) -> [(KeyType, ValueType)] { return Array(dictionary)}

使用情况如下:

let pairs = pairsFromDictionary(["minimum": 199, "maximum": 299])let morePairs = pairsFromDictionary([1: "Swift", 2: "Generics", 3: "Rule"])

使用泛型来定义栈和队列

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

方法被标记为 mutating,因为它们需要修改结构体的 items 数组

队列

struct Queue
{ private var elements = [Element]() mutating func enqueue(newElement: Element){ elements.append(newElement) } mutating func dequeue() -> Element? { guard !elements.isEmpty else { return nil } return elements.removeAtIndex(0) } func peek() -> Element? { return elements.first }}

类型约束

类型约束可以指定一个类型参数必须继承自指定类,或者符合一个特定的协议或协议组合。

例如,Swift 的 Dictionary 类型对字典的键的类型做了些限制。在字典的描述中,字典的键的类型必须是可哈希(hashable)的。也就是说,必须有一种方法能够唯一地表示它。Dictionary 的键之所以要是可哈希的,是为了便于检查字典是否已经包含某个特定键的值。若没有这个要求,Dictionary 将无法判断是否可以插入或者替换某个指定键的值,也不能查找到已经存储在字典中的指定键的值。

如下,在数组中查找是否有需要查找的值:

func findIndex
(array: [T], _ valueToFind: T) -> Int? { for (index, value) in array.enumerate() { if value == valueToFind { return index } } return nil}

但是,这个函数无法通过编译,原因是不是所有的 Swift 类型都可以用等式符(==)进行比较。

Swift 标准库中定义了一个 Equatable 协议,该协议要求任何遵循该协议的类型必须实现等式符(==)及不等符(!=),从而能对该类型的任意两个值进行比较。所有的 Swift 标准类型自动支持 Equatable 协议。

所以,修改后的函数是:

func findIndex
(array: [T], _ valueToFind: T) -> Int? { for (index, value) in array.enumerate() { if value == valueToFind { return index } } return nil}

也可使用where来约束类型:

func mid
(array: [T]) -> T { return array.sort()[(array.count - 1) / 2]}

sort()要可用,需要array遵循Comparable协议。

等同于:

func mid
(array: [T]) -> T { return array.sort()[(array.count - 1) / 2]}

继承泛型类

例如有如下的泛型类:

class Box
{}

有如下的两种继承方式:

class Gift
: Box
{}class StringBox: Box
{}

Enums With Multiple Generic Associated Values

如下的泛型enum有两个关联的值:一个用来表示实际的结果,一个用来表示可能的错误。

enum Result
{ case Success(ValueType) case Failure(ErrorType)}

使用情况如下:

func divideOrError(x: Int, y: Int) -> Result
{ guard y != 0 else { return Result.Failure("Division by zero is undefined") } return Result.Success(x / y)}

转载地址:https://windzen.blog.csdn.net/article/details/53100512 如侵犯您的版权,请留言回复原文章的地址,我们会给您删除此文章,给您带来不便请您谅解!

上一篇:Swift中的协议
下一篇:iOS自定义控件一

发表评论

最新留言

表示我来过!
[***.240.166.169]2024年03月11日 09时40分37秒

关于作者

    喝酒易醉,品茶养心,人生如梦,品茶悟道,何以解忧?唯有杜康!
-- 愿君每日到此一游!

推荐文章

如何区分用户_通信中的多址技术:基站如何区分不同用户,时分与频分多址技术... 2019-04-21
div旋转 vue_Vue实现按钮旋转和移动位置的实例代码_蜡烛_前端开发者 2019-04-21
switchresx卸载_SwitchResX 2019-04-21
python游走代码_python实现BA网络选取节点(deepwalk选取下一个游走节点) 2019-04-21
java sublist_java中利用List的subList方法实现对List分页(简单易学) 2019-04-21
mac电脑循环次数多少算新_苹果电脑电池循环次数多少才正常? 2019-04-21
10000内的亲密数_RICKYOUNG圣诞内购会 | 把暖冬快乐送给你 2019-04-21
calendar.getinstance()获取的是什么时间_为什么建议使用 LocalDateTime 而不是 Date 2019-04-21
linux重启后文件丢失_linux文件系统数据丢失恢复的过程 2019-04-21
uniapp 录音_uni-app 长按录音优化组件 2019-04-21
vue 中indexof_JS数组中的indexOf方法 2019-04-21
java mysql 单例模式_mysql jdbc1 数据库连接 单例模式实例 2019-04-21
2017年java漏洞_【漏洞公告】Oracle多个Java漏洞更新-2017年7月 2019-04-21
linux刻录win10u盘_在Ubuntu Linux下制作Windows 启动安装 USB盘 2019-04-21
linux按照mysql为何如此简单_MySQL菜鸟实录(一):服务安装扫盲(Linux & Windows)... 2019-04-21
mysql期末考试时间2018_2018年9月计算机二级MySQL考试巩固练习题(6) 2019-04-21
vnc 字体设置_安装和配置VNC 2019-04-21
java io封装_Java程序员开发面试宝典之Java IO篇 2019-04-21
java 复制一段对象集合_java 日志脱敏框架 sensitive-新版本0.0.2-深度拷贝,属性为对象和集合的支持... 2019-04-21
java反射测试方法_Java反射知识重拾 2019-04-21