Hashable
に準拠して作成クラス、構造体や列挙型のために難しいことではありません。 適合性を明示的に宣言してHashable
に設定し、プロパティーhashValue: Int
を定義するだけです。実際には、hashValue
は、a == bならばahashValue == b.hashValueならばという簡潔な公理を実現する必要があります。。
(Hashable
に準拠するために、あなたはまた、タイプEquatable
をする必要がありCGPoint
の場合、それはすでにEquatable
である。。)
例をHashable
に準拠CGPoint
を作るために:
extension CGPoint: Hashable {
public var hashValue: Int {
//This expression can be any of the arbitrary expression which fulfills the axiom above.
return x.hashValue^y.hashValue
}
}
var pointDict: [CGPoint: String] = [
CGPoint(x: 1.0, y: 2.0): "PointA",
CGPoint(x: 3.0, y: 4.0): "PointB",
CGPoint(x: 5.0, y: 6.0): "PointC",
]
print(pointDict[CGPoint(x: 1.0, y: 2.0)]) //->Optional("PointA")
として、 CGPoint
にはCGFloat
の値が含まれているため、Dictionary of KeyとしてのCGPoint
は、バイナリ浮動小数点システムの計算エラーに基づいて予期しない動作を引き起こす可能性があります。あなたはそれに余分な注意を払って使用する必要があります。
ADDITION
あなたには、いくつかの計算誤差の問題を回避したいと構造のみInt
秒を含めることができることを受け入れることができます場合は、独自の構造体を定義し、それがHashable
に適合させることができます。
struct MyPoint {
var x: Int
var y: Int
}
extension MyPoint: Hashable {
public var hashValue: Int {
return x.hashValue^y.hashValue
}
public static func == (lhs: MyPoint, rhs: MyPoint) -> Bool {
return lhs.x == rhs.x && lhs.y == rhs.y
}
}
var myPointDict: [MyPoint: String] = [
MyPoint(x: 1, y: 2): "MyPointA",
MyPoint(x: 3, y: 4): "MyPointB",
MyPoint(x: 5, y: 6): "MyPointC",
]
print(myPointDict[MyPoint(x: 1, y: 2)]) //->Optional("MyPointA")
上記のコードよりもそれほど難しくはありませんが、あなたが必要とするもう1つのことは、構造体に対して==
演算子を定義することです。試してみてください。
関連項目:[スイフトでは辞書のキーとしてタプルを使用できますか?](http://stackoverflow.com/q/24131323/2976878) – Hamish