假如有个Bit类,其中含有CGPoint类型的point属性,Class定义如下

  1. class Bit {
  2. var point : CGPoint
  3. init(point : CGPoint) {
  4. self.point = point
  5. }
  6. }

疑问:Bit之间怎么实现比较? 答案:实现Hashable协议就可以,而Hashable实际上又需要实现Equatable协议

1.实现Hashable

当给类增加Hashable协议后,XCode编译抛出"Type 'Bit' does not conform to protocol 'Hashable'.Command+click点击Hashable的定义会发现如下代码:

  1. protocol Hashable : Equatable {
  2. /// Returns the hash value. The hash value is not guaranteed to be stable
  3. /// across different invocations of the same program. Do not persist the hash
  4. /// value across program runs.
  5. var hashValue: Int { get }
  6. }

我们需要实现hashValue属性的getter,总所周知String类型是实现了Hashable的(String类型之间是可以直接比较,排序),所以可以利用String这点来实现Getter,如下代码:

  1. var hashValue : Int {
  2. get {
  3. return "\(self.point.x),\(self.point.y)".hashValue
  4. }
  5. }

增加代码后,发现编译器依然报错"Type 'Bit' does not conform to protocol 'Equatable'"-没有实现Equatable协议。

2.实现Equatable

Commend+click点击Hashable定义,进入后再点击Equatable协议定义,可以看到如下定义:

  1. protocol Equatable {
  2. func ==(lhs: Self, rhs: Self) -> Bool
  3. }

我们会发现Equatable协议是需要实现一个函数,即==函数,那么我们究竟怎么来实现呢?

首先,我们利用getter返回值hashable来进行比较来实现,函数实现代码如下:

  1. func ==(lhs: Bit, rhs: Bit) -> Bool {
  2. return lhs.hashValue == rhs.hashValue
  3. }

以上实际上是实现重载运算符==在下面代码中,我们发现2个point之间可以直接进行比较了。

最终代码如下

  1. // Playground - how to implement Hashable and Equatable
  2. import UIKit
  3. //MARK: - Equatable
  4. func ==(lhs: Bit, rhs: Bit) -> Bool {
  5. return lhs.hashValue == rhs.hashValue
  6. }
  7. class Bit : Hashable {
  8. var point : CGPoint
  9. //MARK: - Hashable
  10. var hashValue : Int {
  11. get {
  12. return "\(self.point.x),\(self.point.y)".hashValue
  13. }
  14. }
  15. //MARK: - Bit
  16. init(point: CGPoint) {
  17. self.point = point
  18. }
  19. }
  20. var point_a_1_0 = Bit(point: CGPoint(x: 1, y: 0))
  21. var point_b_1_0 = Bit(point: CGPoint(x: 1, y: 0))
  22. var point_c_0_1 = Bit(point: CGPoint(x: 0, y: 1))
  23. point_a_1_0 == point_b_1_0
  24. 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的更多相关文章

  1. [IOS]swift自定义uicollectionviewcell

    刚刚接触swift以及ios,不是很理解有的逻辑,导致某些问题.这里分享一下swift自定义uicollectionviewcell 首先我的viewcontroller不是直接继承uicollect ...

  2. Swift 自定义打印方法

    Swift 自定义打印方法 代码如下 // MARK:- 自定义打印方法 func MLLog<T>(_ message : T, file : String = #file, funcN ...

  3. swift 自定义图片轮播视图

    Swift封装图片轮播视图: import UIKit class XHAdLoopView: UIView { private var pageControl : UIPageControl? pr ...

  4. Swift 自定义Subscript

    Swift可以方便给自定义类加下标,其中参数和返回值可以在类里定义为任意类型: subscript(parameters) -> ReturnType { get { //return some ...

  5. swift:自定义UICollectionViewFlowLayout

    写作目的 UICollectionView是ios中一个十分强大的控件,利用它能够十分简单的实现一些很好看的效果.UICollectionView的效果又依赖于UICollectionViewLayo ...

  6. swift 自定义TabBarItem

    1.效果图     2.NewsViewController.swift // // NewsViewController.swift // NavigationDemo // // Created ...

  7. Swift - 自定义UIActivity分享

    UIActivity可以十分方便地将文字.图片等内容进行分享,比如分享到微信.微博.发送邮件.短信等等.我们不仅可以分享内容出来,也可以在自己的App里添加自己的分享按钮或隐藏已有的分享按钮来实现定制 ...

  8. Swift - 自定义单元格实现微信聊天界面

    1,下面是一个放微信聊天界面的消息展示列表,实现的功能有: (1)消息可以是文本消息也可以是图片消息 (2)消息背景为气泡状图片,同时消息气泡可根据内容自适应大小 (3)每条消息旁边有头像,在左边表示 ...

  9. swift 自定义弹框

    // //  ViewController.swift //  animationAlert // //  Created by su on 15/12/9. //  Copyright © 2015 ...

随机推荐

  1. 网易云课堂_C++开发入门到精通_章节7:模板

    课时35类模板 类模板 创建类模板的实例 class Name<类型参数表>object; 类模板与模板类的区别 类模板是模板的定义,不是一个实实在在的类,定义中用到通用类型参数 模板类是 ...

  2. 【转】android 电容屏(三):驱动调试之驱动程序分析篇

    关键词:android  电容屏 tp 工作队列 中断 坐点计算  电容屏主要参数平台信息:内核:linux2.6/linux3.0系统:android/android4.0  平台:S5PV310( ...

  3. Unity 编辑器扩展自定义窗体

    这次看见Unity还可以自定义弹出窗体,让我很好奇.于是就去网上找文章看了看. 如果想自定义窗体需要把类放入Editor文件夹下面. 代码如下: using UnityEngine; using Un ...

  4. Unity 人物跟谁手指的移动(第一种方式)

    长夜漫漫无心睡眠,敲敲代码,越敲越来劲! 我发现好多小朋友都在玩熊出没之xxxx这个游戏,居然打了一下午都没玩通第2关,我把测试也叫来陪我一起玩! 结果他也打不通,我再去叫策划,他也没打过,我去叫主管 ...

  5. 手机端Zepto框架,利用swipejs插件做banner轮播图

    一,HTML部分<div class="banner"> <div id="slider" class="swipe"&g ...

  6. WPFS数据绑定(要是后台类对象的属性值发生改变,通知在“client界面与之绑定的控件值”也发生改变须要实现INotitypropertyChanged接口)

    WPFS数据绑定(要是后台类对象的属性值发生改变,通知在"client界面与之绑定的控件值"也发生改变须要实现INotitypropertyChanged接口) MainWindo ...

  7. python 笔记2--函数

    函数变量 >>> a = abs # 变量a指向abs函数 >>> a(-1) # 所以也可以通过a调用abs函数 1 定义函数 def my_abs(x): if ...

  8. NET基础课--异常处理X

    通常不建议如下的捕获方式  正确的方法是:某一功能函数的入口捕获基本异常即exception,分支方法或片段方法中捕获特定异常 高级: 另附:Fxcop异常监控工具

  9. C#中“@”的作用和用法

    “@”在看别人程序的时候偶尔看到,总结了一下两个用途 1. 不常用,也不推介用的用法. @关键字 可以作为标识符来使用,说白了,就是讲关键字变成非关键字. 2.逐字字符串字面量,以@开头,后面是由引导 ...

  10. Reverse Linked List II java

    public static ListNode reverseBetween(ListNode head, int m, int n) { ListNode pre=head,current=head, ...