Swift自定义Class实现Hashable
假如有个Bit类,其中含有CGPoint类型的point属性,Class定义如下
class Bit {
var point : CGPoint
init(point : CGPoint) {
self.point = point
}
}
疑问:Bit之间怎么实现比较? 答案:实现Hashable协议就可以,而Hashable实际上又需要实现Equatable协议
1.实现Hashable
当给类增加Hashable协议后,XCode编译抛出"Type 'Bit' does not conform to protocol 'Hashable'.Command+click点击Hashable的定义会发现如下代码:
protocol Hashable : Equatable {
/// Returns the hash value. The hash value is not guaranteed to be stable
/// across different invocations of the same program. Do not persist the hash
/// value across program runs.
var hashValue: Int { get }
}
我们需要实现hashValue属性的getter,总所周知String类型是实现了Hashable的(String类型之间是可以直接比较,排序),所以可以利用String这点来实现Getter,如下代码:
var hashValue : Int {
get {
return "\(self.point.x),\(self.point.y)".hashValue
}
}
增加代码后,发现编译器依然报错"Type 'Bit' does not conform to protocol 'Equatable'"-没有实现Equatable协议。
2.实现Equatable
Commend+click点击Hashable定义,进入后再点击Equatable协议定义,可以看到如下定义:
protocol Equatable {
func ==(lhs: Self, rhs: Self) -> Bool
}
我们会发现Equatable协议是需要实现一个函数,即==函数,那么我们究竟怎么来实现呢?
首先,我们利用getter返回值hashable来进行比较来实现,函数实现代码如下:
func ==(lhs: Bit, rhs: Bit) -> Bool {
return lhs.hashValue == rhs.hashValue
}
以上实际上是实现重载运算符==在下面代码中,我们发现2个point之间可以直接进行比较了。

最终代码如下
// Playground - how to implement Hashable and Equatable
import UIKit
//MARK: - Equatable
func ==(lhs: Bit, rhs: Bit) -> Bool {
return lhs.hashValue == rhs.hashValue
}
class Bit : Hashable {
var point : CGPoint
//MARK: - Hashable
var hashValue : Int {
get {
return "\(self.point.x),\(self.point.y)".hashValue
}
}
//MARK: - Bit
init(point: CGPoint) {
self.point = point
}
}
var point_a_1_0 = Bit(point: CGPoint(x: 1, y: 0))
var point_b_1_0 = Bit(point: CGPoint(x: 1, y: 0))
var point_c_0_1 = Bit(point: CGPoint(x: 0, y: 1))
point_a_1_0 == point_b_1_0
point_a_1_0 == point_c_0_1
以上代码在XCode6 GM测试通过。
原文:http://www.swiftcoder.info/dev/codefellows/2014/8/2/how-to-implement-hashable-for-your-custom-class
Swift自定义Class实现Hashable的更多相关文章
- [IOS]swift自定义uicollectionviewcell
刚刚接触swift以及ios,不是很理解有的逻辑,导致某些问题.这里分享一下swift自定义uicollectionviewcell 首先我的viewcontroller不是直接继承uicollect ...
- Swift 自定义打印方法
Swift 自定义打印方法 代码如下 // MARK:- 自定义打印方法 func MLLog<T>(_ message : T, file : String = #file, funcN ...
- swift 自定义图片轮播视图
Swift封装图片轮播视图: import UIKit class XHAdLoopView: UIView { private var pageControl : UIPageControl? pr ...
- Swift 自定义Subscript
Swift可以方便给自定义类加下标,其中参数和返回值可以在类里定义为任意类型: subscript(parameters) -> ReturnType { get { //return some ...
- swift:自定义UICollectionViewFlowLayout
写作目的 UICollectionView是ios中一个十分强大的控件,利用它能够十分简单的实现一些很好看的效果.UICollectionView的效果又依赖于UICollectionViewLayo ...
- swift 自定义TabBarItem
1.效果图 2.NewsViewController.swift // // NewsViewController.swift // NavigationDemo // // Created ...
- Swift - 自定义UIActivity分享
UIActivity可以十分方便地将文字.图片等内容进行分享,比如分享到微信.微博.发送邮件.短信等等.我们不仅可以分享内容出来,也可以在自己的App里添加自己的分享按钮或隐藏已有的分享按钮来实现定制 ...
- Swift - 自定义单元格实现微信聊天界面
1,下面是一个放微信聊天界面的消息展示列表,实现的功能有: (1)消息可以是文本消息也可以是图片消息 (2)消息背景为气泡状图片,同时消息气泡可根据内容自适应大小 (3)每条消息旁边有头像,在左边表示 ...
- swift 自定义弹框
// // ViewController.swift // animationAlert // // Created by su on 15/12/9. // Copyright © 2015 ...
随机推荐
- 【转】android 电容屏(二):驱动调试之基本概念篇
关键词:android 电容屏 tp 工作队列 中断 多点触摸协议平台信息:内核:linux2.6/linux3.0系统:android/android4.0 平台:S5PV310(samsung ...
- HttpURLConnection访问url的工具类
java代码: import java.io.BufferedReader; import java.io.DataOutputStream; import java.io.IOException; ...
- JS~delegate与live
在jquery里有两个方法可以用来绑定自动追加出来的DOM对象,它们是live和delegate,事实上,这两个方法是bind方法的一个变体,在对于固定DOM对象时,我们通常使用bind就可以了,而对 ...
- cocos2d-x-2.2.5项目创建--命令行创建
Gavin:downloads DavidLik$ cd cocos2d-x-2.2.5/ Gavin:cocos2d-x-2.2.5 DavidLik$ cd tools/ Gavin:tools ...
- Struts2与ajax整合之缺点
之前有篇博客介绍了Struts2与ajax的整合,链接Struts2之-集成Json插件实现Ajax 这里不再累述,看以上博客. 此篇博客想吐槽一下Struts2的缺点--错误处理做的不好,怎么做的不 ...
- oninput,onpropertychange,onchange的使用方法和差别
1.前言 因为工作须要,需实现一个相似于微博输入框的功能,在用户动态输入文字的时候,改动提示“您还能够输入XX字”.例如以下图所看到的: 因此,略微研究了一下oninput,onpropertycha ...
- apache如何在虚拟主机中实现用户验证
1,在相应的虚拟主机配置文件段,加入<Directory /data/www.admin.php> AllowOverride AuthConfig ...
- vs2010 中检测到有潜在危险的 Request.Form 值
解决方法 : 一般在网上搜只有以下两种处理方式: 1.在报错的页面前吧<%Page%>标签中增加validateRequest="false"的属性为false 如下所 ...
- <转>maven发布第三方jar的一些问题
在创建maven中私有仓库过程中,需要发布一些第三方jar到nexus仓库,使用命令的是 deploy:deploy-file 有许多参数,具体可查看 http://maven.apache.org/ ...
- 封装一些数据库SQLCipher的方法(增、删、改、查)
上一篇随笔只是简单的说了一下使用SQLCipher框架,介绍的比较笼统,可能看一遍之后更加蒙圈了,为了更好的使用这个数据库,整理了我在公司项目的需要用的方法,包括创建表,插入数据,更新数据,搜索查询数 ...