如何使用自定义类类型作为Swift中Dictionary的键?

Are*_* Li 11 dictionary swift

我正在研究一个使用Swift构建的项目,我正在尝试创建一个字典来存储一个名为Pixel的自定义类的对象(KEY,用于存储RGB值等颜色信息)和int值(Value,用于计算多少相同颜色出现在同一图像上的次数).

如果这是在C#中,则工作代码应为:

Dictionary<Pixel, int> colorDictionary = new Dictionary< Pixel, int> ();

在Swift中,我试过:

var colorDictionary = Dictionary<Pixel, Int>()
Run Code Online (Sandbox Code Playgroud)

但是,我得到的错误:

"类型'Pixel'不符合协议'Hashable'"

我该怎么做才能解决这个问题?非常感谢!

And*_*nez 4

任何想要使用字典键的自定义类型都必须符合协议Hashable

该协议有一个您必须实现的属性。

var hashValue: Int { get }

使用此属性生成一个 int,Dictionary 可以将其用于查找目的。您应该尝试使其生成的 hashValue 对于每个像素都是唯一的。

Swift 书中有以下注释,因此您可以创建随机哈希(只要它是唯一的):

类型的hashValue属性返回的值不需要在同一程序的不同执行或不同程序中相同。

请注意,因为Hashable继承自Equatable您还必须实现:

func ==(_ lhs: Self, _ rhs: Self) -> Bool.
Run Code Online (Sandbox Code Playgroud)

我不确定像素的内部结构是什么,但当两个像素具有相同的“x”和“y”值时,您可能会认为两个像素相等。最终的逻辑取决于你。

根据需要修改此:

struct Pixel : Hashable {

    // MARK: Hashable
    var hashValue: Int {
        get {
            // Do some operations to generate a unique hash.
        }
    }
}

//MARK: Equatable
func ==(lh: Pixel, rh: Pixel) -> Bool {
    return lh.x == rh.x && rh.y == lh.y
}
Run Code Online (Sandbox Code Playgroud)