前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >专栏 >Swift之Hashable协议

Swift之Hashable协议

作者头像
SheltonWan
修改于 2019-07-01 07:01:31
修改于 2019-07-01 07:01:31
4.1K0
举报

Overview

符合Hashable协议的任何类型,既可以在集合(Set)中使用,也可以作为字典键使用。默认情况下,标准库中的许多类型都符合Hashable:字符串,整数,浮点和布尔值,还有事件集合(even sets)。其他类型(例如,选项(optionals),数组(Array)和范围(Range))在其类型参数实现符合hashable时就会自动变为hashable。

您自己定义的类型也可以hashable。当您定义没有关联值的枚举时,它会自动获得Hashable符合性,并且您可以通过实现hash(into :)方法将Hashable符合性添加到其他自定义类型。对于其存储属性都是符合Hashable的结构,以及具有all-Hashable关联值的枚举类型,编译器能够自动提供hash(into :)的实现。

散列值意味着将其基本组件(essential component)提供给哈希函数,由哈希类型表示。基本组件(essential component)是那些有助于Equatable类型实现的组件。两个相等的实例必须以相同的顺序将相同的值提供给Hasher的hash(into :)。

Conforming to Hashable Protocol

要在集合中使用您自己的自定义类型或作为字典的键类型,请在类型中遵循Hashable协议。 Hashable协议继承自Equatable协议,因此您还必须满足该协议的要求。

当您在类型的原始声明中遵循Hashable协议并且您的类型符合以下条件时,编译器会自动合成您的自定义类型的Hashable和要求:

  • 对于结构,其所有存储的属性必须遵循Hashable。
  • 对于枚举,其所有关联值必须遵循Hashable。 (即使没有声明,没有关联值的枚举也具有Hashable一致性。)

要自定义你的类型以遵循Hashable协议,或者要在不符合上面列出的条件的类型中遵循Hashable,或者要扩展现有类型以遵循Hashable,请在自定义类型中实现hash(into :)方法。

在你的hash(into :)实现中,在提供的Hasher实例上以你的类型的基本组件调用combine(_ :)。为确保您的类型符合Hashable和Equatable协议的语义要求,最好还要自定义类型的Equatable一致性(conformance)以匹配。

例如,考虑一个GridPoint类型,它描述按钮网格中的位置。这是GridPoint类型的初始声明:

/// x-y坐标系中的一个点。

struct GridPoint {

var x:Int

var y:Int

}

您想要创建一组用户点击过的网格点。由于GridPoint类型尚不遵循hashable,因此无法在集合中使用。要添加Hashable一致性,请提供==运算符函数并实现hash(into :)方法。

extension GridPoint:Hashable {

static func ==(lhs:GridPoint,rhs:GridPoint) - > Bool {

r eturn lhs.x == rhs.x && lhs.y == rhs.y

}

func hash(into hasher:inout Hasher){

hasher.combine(x)

hasher.combine(y)

}

}

此示例中的hash(into :)方法将网格点的x和y属性提供给(feed)提供的hasher。这些属性与用于在==运算符函数中测试相等性的属性相同。

现在GridPoint符合Hashable协议,您可以创建一组先前点击的网格点。

var tappedPoints:Set = [GridPoint(x:2,y:3),GridPoint(x:4,y:1)]

let nextTap = GridPoint(x:0,y:1)

If tappedPoints.contains(nextTap){

print(“已经点击了(\(nextTap.x),\(nextTap.y))。”)

} else {

tappedPoints.insert(nextTap)

print(“在(\(nextTap.x),\(nextTap.y))检测到新点击。”)

}

//打印“在(0,1)处检测到新点击。”)

本文系外文翻译,前往查看

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

本文系外文翻译,前往查看

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

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
在Swift中标识对象
我们经常会遇到这样的情况:我们需要找到一种方法,根据一些身份的概念来存储对象。无论是在缓存中,还是在磁盘上存储对象的表示,或者简单地使用字典——我们经常需要找到方法来唯一地识别我们所处理的对象。
韦弦zhy
2022/03/30
7540
Swift基础 协议
翻译自:https://docs.swift.org/swift-book/LanguageGuide/Protocols.html
郭顺发
2023/07/17
1580
Swift进阶五——集合类之Set&Dictionary
Set是指具有某种特定性质的具体的或者抽象的对象汇总而成的集体。其中,构成Set的这些对象则称为该Set的元素。
拉维
2021/01/12
1.1K0
Swift进阶五——集合类之Set&Dictionary
Swift 读标准库源码笔记 -- Integers(基本数据类型篇)
版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
星宇大前端
2019/10/25
1K0
第 11 章 关联容器
第 11 章 关联容器 标签: C++Primer 学习记录 关联容器 ---- 第 11 章 关联容器 11.1 使用关联容器 11.2 关联容器概述 11.3 关联容器操作 11.4 无序容器 ---- 11.1 使用关联容器 标准库中定义了 8个关联容器,这些容器的不同体现在三个维度上。 或者是一个 set,或者是一个 map。 或者要求不重复的关键字,或者允许重复关键字,允许重复的容器的名字中都包含单词 multi。 或者按顺序保存元素或无序保存。不保持关键字按顺序存储的容器的名字都以 unord
用户1653704
2018/06/07
5670
并查集详解和STL中的自定义哈希
今天我们要介绍一种简单但对于合并和查找都十分高效的结构——并查集,其底层实现也十分简单,并且应用非常广泛,比如最小生成树算法中的Kruskal算法,里面有使用了并查集的结构!并且在并查集结构为了加速查找,底层使用基于hash的容器,在CPP中,叫做unordered_map! unordered_map是C++11标准的东西,其为基础类型提供了hash模板,但是如果自定义类型呢?我们如何去构建这个容器?下面会给你答案!
算法工程师之路
2019/08/05
1.4K0
Swift 4.0 新特性
WWDC 2017 带来了很多惊喜,在这次大会上,Swift 4 也伴随着 Xcode 9 测试版来到了我们的面前,虽然正式版要8月底9月初才会公布,但很多强大的新特性正吸引我们去学习它。根据大会上已经开放的新特性,先一睹为快。 体验 Swift 4包含在Xcode 9中,您可以从Apple的开发者门户下载最新版本的Xcode 9(您必须拥有一个活跃的开发者帐户)。 每个Xcode测试版将在发布时捆绑最新的Swift 4快照。在阅读时,您会注意到[SE-xxxx]格式的链接。 这些链接将带您到相关的Swif
xiangzhihong
2018/02/06
1.8K0
Swift 4.0 新特性
Swift基础 通用
翻译自:https://docs.swift.org/swift-book/LanguageGuide/Generics.html
郭顺发
2023/07/17
1150
Swift 4.2新特性——WWDC2018 Session401笔记
厨子今年的演讲很不给力。不过既然是软件开发者大会嘛,焦点自然应该放在软件功能上。 所以我看了下今年的Session401,也就是Swift4.2新特性介绍,做了下笔记,希望能对你有用。 多说一句,Swift越来越好用了,希望开发者能尽快拥抱Swfit。
nimomeng
2018/09/13
1.3K0
Swift 4.2新特性——WWDC2018 Session401笔记
Swift学习:协议
本篇将详细总结介绍Swift协议的用法; 协议是定义一些规范(属性、功能方法),然后由类、结构体或者枚举遵循并实现这些规范,这一过程被称为遵循了协议。
梧雨北辰
2018/08/09
4920
Swift 5.7 针对主要关联类型的轻量级同类型优化
如果你正在实现开发一个语法高亮库,并且定义一个函数readSyntaxHighlightedLines读取高亮语法的行数, 这个函数使用SyntaxTokenSequence来包装返回结果,结果中的元素类型是[Token], 代表每一行中语法高亮的 token 数组。例如:
DerekYuYi
2022/10/08
5770
使用 key paths 创建自定义查询函数
作为一个相当严格,静态编译的语言,Swift可能不会在语法自定义方面提供许多渠道,但这实际上确正好相反。通过自定义和重载运算符,key paths,函数/结果构建器 等功能,我们有很多机会为特定用例进行调整 Swift 的语法。
韦弦zhy
2021/07/01
1.3K0
Swift 泛型之条件性符合协议
Swift 泛型条件性符合(Conditional conformances) 表示泛型类型只有在其类型参数满足某些要求时才符合特定协议的概念。
韦弦zhy
2021/04/08
1.5K0
Swift进阶三——运算符相关
我们本来是打算判断变量a和变量b是否相等,但是却手残,将a == b写成了a = b。这在Swift中,会报如下错误:
拉维
2020/12/11
4970
Swift进阶三——运算符相关
C++20 飞船运算符
不同于之前的6种比较运算符:<、>、==、!= <=、>=。C++20提出一种的新的比较运算符——飞船运算符。
程序员的园
2024/07/18
1190
C++20 飞船运算符
Swift基础 访问控制
翻译自:https://docs.swift.org/swift-book/LanguageGuide/AccessControl.html
郭顺发
2023/07/17
1620
HarmonyOS:@AnimatableExtend 装饰器自学指南
在最近的项目开发中,我遇到了需要实现复杂动画效果的需求。在探索解决方案的过程中,我发现了 ​​@AnimatableExtend​​​ 装饰器,它为实现动画效果提供了一种非常灵活且强大的方式。然而,在学习这个装饰器的过程中,我发现相关的资料并不是特别丰富,而且很多资料都缺乏系统性的讲解。因此,我决定写这篇博客,将自己的学习经验和理解分享出来,希望能帮助更多的开发者快速掌握 ​​@AnimatableExtend​​ 装饰器的使用。
李游Leo
2025/03/25
430
HarmonyOS:@AnimatableExtend 装饰器自学指南
Swift 中风味各异的类型擦除
Swift的总体目标是强大得足以用于低级(low-level)系统编程,又足够容易以便初学者学习,有时会导致非常有趣的情况——当 Swift 功能强大的类型系统要求我们配置相当先进的技术来解决乍看之下似乎微不足道的问题的时候。
韦弦zhy
2021/04/19
1.7K0
Swift 中风味各异的类型擦除
Encoding and Decoding Custom Types
许多编程任务涉及通过网络连接发送数据,将数据保存到磁盘或将数据提交到API和服务。 这些任务通常要求在传输数据时将数据编码和解码为中间格式。
SheltonWan
2019/08/04
1.9K0
Swift 3到5.1新特性整理
Swift 5.0 最重要的自然是ABI Stability, 对此可以看这篇 Swift ABI 稳定对我们到底意味着什么 。
小刀c
2022/08/16
4.7K0
Swift 3到5.1新特性整理
相关推荐
在Swift中标识对象
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
查看详情【社区公告】 技术创作特训营有奖征文