Skip to content

Instantly share code, notes, and snippets.

@externvoid
Last active May 25, 2016 00:45
Show Gist options
  • Select an option

  • Save externvoid/3029a1c3065c5bb8c40a7d5b6d456130 to your computer and use it in GitHub Desktop.

Select an option

Save externvoid/3029a1c3065c5bb8c40a7d5b6d456130 to your computer and use it in GitHub Desktop.
辞書のキーにできる型をて意義する。func == のところが奇妙。グローバル関数なのが、変だ。これ、熊谷さんのblog掲載のコード。
class KeyClass {
var value:String
init(_ value:String) {
self.value = value
}
}
extension KeyClass : Hashable {
var hashValue: Int {
return self.value.hashValue
}
}
func == (lhs:KeyClass, rhs:KeyClass) -> Bool {
return lhs.value == rhs.value
}
var dic = [KeyClass:Int]()
let k1 = KeyClass("A")
let k2 = KeyClass("B")
let k3 = KeyClass("C")
dic[k1] = 1
dic[k2] = 2
dic[k3] = 3
print(dic)
// swift2.0からはNSObjectがdefaultでEquatableに準拠している。==をisEqualに置き換えれば良いのか?(編集中)
// http://stackoverflow.com/questions/24467960/swift-equatable-protocol
// かなり書き換えると動いた。
import Foundation
class KeyClass: NSObject {
var value:String
init(_ value:String) {
self.value = value
}
}
extension KeyClass {
override var hashValue: Int {
return self.value.hashValue
}
func isEqual(lhs:KeyClass, rhs:KeyClass) -> Bool {
return lhs.value == rhs.value
}
}
var dic = [KeyClass:Int]()
let k1 = KeyClass("A")
let k2 = KeyClass("B")
let k3 = KeyClass("C")
dic[k1] = 1
dic[k2] = 2
dic[k3] = 3
print(dic)
// [<main.KeyClass: 0x7fc5dbfd13c0>: 3, <main.KeyClass: 0x7fc5dbfd1390>: 2, <main.KeyClass: 0x7fc5dbfdb290>: 1]
// import Foundationのところが重要!NSObjet準拠させずにEquatable準拠させたら、エラー満載だ。
// NSObjectに準拠させれば、Equatable, Hashable共にすでに準拠だとコンパイラが教えてくれる⁉️
@externvoid

externvoid commented May 25, 2016 •

Copy link
Copy Markdown
Author

self.value.hashvalue <- ココ解説
Int, String等、主要なクラスにはhashValueプロパティーが定義されている。この行のself.valueはString型である。
例えばString型のインスタンスxxのhashValueは次の通りである。
var xx = "OK"
print(xx.hashValue) //4799450059485113901

extension KeyClass : Hashable {
var hashValue: Int { <- ココ解説
KeyClass型のhashValueコンピューティッドプロパティーに、String型のhashValueを流用する。このhashValueプロパティーがあれば、辞書のキーになれる。
==演算子のOverrideも必要かも。⁉️

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment