gpt4 book ai didi

swift - 如何在没有通用用法的情况下在 Swift 3.0 中使用 Set

转载 作者:行者123 更新时间:2023-11-28 06:33:37 25 4
gpt4 key购买 nike

首先,我不得不说我来自 Java 编程,与 Java 相比,Swift 3.0 中的一切似乎都非常复杂。我以为我想做的事很容易,但事实证明并非如此。

我有两个对象:

protocol Customer {
}

和:

class Consulter {
}

我希望我的 Consulter 类包含 SetCustomer:

class Consulter {
var customers: Set<Customer>;
}

好的,这里是第一件事。编译器现在提示 Customer 必须实现 Hashable...真的吗? Swift 不是为我做的吗?好的。所以让我们开始吧:

func ==(lhs: Customer, rhs: Customer) -> Bool {
return lhs.hashValue == rhs.hashValue;
}

protocol Customer: Hashable {

var: hashValue: Int {
return "123".hashValue;
}
}

在我的 Consulter 类(class)中,我现在必须执行以下操作:

class Consulter<T: Customer> {

var customers: Set<T>;
}

好的,这是有效的。但现在我有另一个类(class):

func ==(lhs: Location, rhs: Location) -> Bool { // here the error!
return lhs.hashValue == rhs.hashValue;
}

class Location<T: Customer> : Hashable {

var customer: T;

....
}

对于 Location 类的 Equatable 我现在得到错误:

Reference to generic type 'Location' requires arguments in <...>

那么编译器在这里期望什么参数?目前我不知道任何具体类型。

编辑

my Customer 协议(protocol)稍后会有不同的具体实现。例如,客户 可以是家庭。在 Consulter 类中,我想要一个 SetCustomer 包含:家庭和个人。我认为这是一种简单而合乎逻辑的方法。

最佳答案

由于您打算在必须是Hashable 的应用程序中使用符合Customer 的类型(例如作为Set 的成员),所以没有理由不将此 Hashable 约束直接添加到 Customer 协议(protocol)中。通过这种方式,您可以将符合 Hashable 的责任转移到您认为是 Customer

的实际类型
protocol Customer: Hashable {}

class Consulter<T: Customer> {
var customers: Set<T>?
}

class Location<T: Customer>: Hashable {
var customer: T
init(customer: T) { self.customer = customer }

var hashValue: Int {
return customer.hashValue
}
}

func ==<T: Customer>(lhs: Location<T>, rhs: Location<T>) -> Bool {
return lhs.customer == rhs.customer /* && ... test other properties */
}

此外,使用 X.hashValue == Y.hashValue 进行相等性测试时要小心,因为不能保证哈希值是唯一的(认为它们主要用于巧妙的“bin”分类)。

或者,从 Swift 3 开始

// ... as above

class Location<T: Customer>: Hashable {
var customer: T
init(customer: T) { self.customer = customer }

var hashValue: Int {
return customer.hashValue
}

static func ==(lhs: Location<T>, rhs: Location<T>) -> Bool {
return lhs.customer == rhs.customer /* && ... test other properties */
}
}

关于swift - 如何在没有通用用法的情况下在 Swift 3.0 中使用 Set,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39620080/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com