Swift - 创建一个类似元组的可哈希结构体

3

我正在尝试创建一个可保存任何类型对象的类似元组的可哈希对象,以便将其用作字典键。我在两个地方使用这个结构,一次是保存2个整数,另一次是保存一个double和前面提到的2个Int结构。

我的当前实现有点欺骗性。我创建了一个结构Suple,它包含两个整数,并且是可哈希的,然后创建了另一个结构Duple,它包含一个double和一个suple,并且也是可哈希的。这样做是可以的,但我想肯定有更好、更干净的实现方法。在搜索和尝试使用泛型之后,我似乎无法使它工作,因此任何建议都将不胜感激。

编辑:实际上,我的代码与Anton的代码几乎完全相同,除了在等式声明中的==后面添加的内容。我没有意识到这是必需的,在添加后,现在它可以正常工作了!


1
看一下你已经完成的工作会很有帮助 - 所以我建议你发布一下你目前为止所做的。 - Antonio
1
请发布您的代码,以便我们可以查看您对Duple和Suple的实现,并进一步为您提供建议。从描述中很难知道您想要实现什么。 - Sandeep
1个回答

4
像这样的东西吗?
struct Duplet<A: Hashable, B: Hashable>: Hashable {
    let one: A
    let two: B

    var hashValue: Int {
        return one.hashValue ^ two.hashValue
    }

    init(_ one: A, _ two: B) {
        self.one = one
        self.two = two
    }
}

func ==<A, B> (lhs: Duplet<A, B>, rhs: Duplet<A, B>) -> Bool {
    return lhs.one == rhs.one && lhs.two == rhs.two
}

let a = Duplet<Int, Int>(4, 2)

a.one
a.two
a.hashValue

let b = Duplet<Double, Double>(1.0, 2.0)

b.one
b.two
b.hashValue

let c = Duplet<Int, Double>(4, 5.0)

c.one
c.two
c.hashValue

是的!我的代码实际上看起来几乎和这个一模一样,除了在“==”之后加上了<A,B>,这证明了它的重要性。我没有意识到你需要那个,但是添加了之后,现在它可以工作了。 - KHAAAAAAAAN

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接