Last active
May 25, 2016 00:45
-
-
Save externvoid/3029a1c3065c5bb8c40a7d5b6d456130 to your computer and use it in GitHub Desktop.
辞書のキーにできる型をて意義する。func == のところが奇妙。グローバル関数なのが、変だ。これ、熊谷さんのblog掲載のコード。
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| 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共にすでに準拠だとコンパイラが教えてくれる⁉️ |
Author
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
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も必要かも。