iT邦幫忙

第 12 屆 iThome 鐵人賽

DAY 11
0
Software Development

給我 30 天,給你一輩子:Swift 從零開始系列 第 11

Day 11 | Swift Collection Types 番外篇: Hashable Protocol

  • 分享至 

  • xImage
  •  

Hashable Protocol

還記得 Collection Types 中的 Set 以及 Dictionary 嗎?/images/emoticon/emoticon06.gif

在這兩個無序排列的型別中,是不允許存在兩個相同的 Element,否則就會發生錯誤,但是又是怎麼知道是否有兩個相同的 Element?

官方文件中,在說明 Set 中有一段話:

A type must be hashable in order to be stored in a set—that is, the type must provide a way to compute a hash value for itself.

Hashable Protocol Document 中也提到了這段話:

You can use any type that conforms to the Hashable protocol in a set or as a dictionary key

我們可以知道,原來只有遵從 Hashable Protocol 的型別,才可以被放入 Set 或是當成 Dictionary Key,其實很多常見的型別都實作了這個協定,像是 String、Int、Float、Double 以及 Boolean ,甚至是 Array 都遵循了 Hashable Protocol。

只要實作 Hashable Protocol,他會依照本身的資料內容,產生一個隨機整數型別的 Hash 值( 所以可能每一次 Print 的結果不同 ),它提供了一個實體屬性 hashValue,所以假定今天有兩個變數:ab,若 a == b,則 a.hashValue == b.hashValue

let a = "測試"
let b = "測試"
print(a.hashValue) // -2082269075308414048
print(b.hashValue) // -2082269075308414048

print(a == b) // true
print(a.hashValue == b.hashValue) // true
let a = "測試1"
let b = "測試2"
print(a.hashValue) // 480433398084574967
print(b.hashValue) // 7580141589794196104

print(a == b) // false
print(a.hashValue == b.hashValue) // false

所以在 Set 以及 Dictionary 中,就是利用 Hash Value 來判斷是否有重複的 Element,這樣對於 Set 及 Dictionary 的使用就很安全。/images/emoticon/emoticon15.gif


上一篇
Day 10 | Swift Collection Types 三部曲之終章:Dictionary
下一篇
Day 12 | Swift Loops 的糾葛:For-in 和 ForEach
系列文
給我 30 天,給你一輩子:Swift 從零開始30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言