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 ...
随机推荐
- 认识SVN
TortoiseSVN 是 Subversion 版本控制系统的一个免费开源客户端,可以超越时间的管理文件和目录.文件保存在中央版本库,除了能记住文件和目录的每次修改以外,版本库非常像普通的文件 服务 ...
- Android应用程序窗口(Activity)的测量(Measure)、布局(Layout)和绘制(Draw)过程分析
文章转载至CSDN社区罗升阳的安卓之旅,原文地址:http://blog.csdn.net/luoshengyang/article/details/8372924 在前面一篇文章中,我们分析了And ...
- 解读JavaScript代码 var ie = !-[1,]
var ie = !-[1,]: 这句代码在IE9之前曾被称为世界上最短的IE判定代码.代码虽短但确包含了不少javascript基础知识在里面.在这个例子中代码执行时会先调用数组的toString( ...
- NET基础课--异常处理X
通常不建议如下的捕获方式 正确的方法是:某一功能函数的入口捕获基本异常即exception,分支方法或片段方法中捕获特定异常 高级: 另附:Fxcop异常监控工具
- cocoapods导入第三方库
1.移除现有Ruby默认源 终端:gem sources --remove https://rubygems.org/ 2.使用新的源 终端:gem sources -a https://ruby.t ...
- iOS开发面试题整理 (三)
1. 风格纠错题 修改完的代码: typedef NS_ENUM(NSInteger, CYLSex) { CYLSexMan, CYLSexWoman }; @interface CYLUser : ...
- iOS之短信认证
短信验证 现在很多的短信验证平台,我们比较常用的有移动开发者服务平台 根据短信验证文档来集成 1. 找到iOS短信验证的集成开发文档 2. 下载SDK和Demo目录结构 3. 运行Demo 4. 写 ...
- session进程和服务
session如果是存在进程内的话,当进程重启,session数据就会丢失. 所以就找到了个办法,不吧session放在进程内,而是放在服务器上.这样子只要服务器不重启,session数据就不会丢失. ...
- org.springframework.beans.factory.BeanCreationException
org.springframework.beans.factory.BeanCreationException 这个是创建bean的异常. 我所遇到的情况是由下面这个引起的: @Resource an ...
- webpy + nginx + fastcgi 构建python应用
1.准备环境 CentOs 6.3 nginx-1.4.2.tar.gz http://nginx.org/download/nginx-1.4.2.tar.gz openss ...