gpt4 book ai didi

swift - 如何评估同质集合的平等性?

转载 作者:可可西里 更新时间:2023-10-31 23:59:43 25 4
gpt4 key购买 nike

案例:

考虑以下几点:

protocol Car {
static var country: String { get }
var id: Int { get }
var name: String { get set }
}

struct BMW: Car {
static var country: String = "Germany"
var id: Int
var name: String
}

struct Toyota: Car {
static var country: String = "Japan"
var id: Int
var name: String
}

这里我有一个简单的例子,说明如何使用 -Car- 协议(protocol)创建抽象层,因此我能够声明一个异构的汽车集合:

let cars: [Car] = [BMW(id: 101, name: "X6"), Toyota(id: 102, name: "Prius")]

而且效果很好。

问题:

我希望能够评估汽车的平等性(通过id),示例:

cars[0] != cars[1] // true

所以,我试图做的是让 Car 符合 Equatable 协议(protocol):

protocol Car: Equatable { ...

但是,我遇到了“典型的”编译时错误:

error: protocol 'Car' can only be used as a generic constraint because it has Self or associated type requirements

我无法再声明 cars: [Car] 数组。如果我没记错的话,其背后的原因是 Equatable 使用了 Self,因此它会被认为是同类的。

我该如何处理这个问题?可以Type erasure是一种解决机制吗?

最佳答案

一个可能的解决方案是协议(protocol)扩展,而不是操作符,它提供了一个isEqual(to 函数

protocol Car {
static var country: String { get }
var id: Int { get }
var name: String { get set }
func isEqual(to car : Car) -> Bool
}

extension Car {
func isEqual(to car : Car) -> Bool {
return self.id == car.id
}
}

并使用它

cars[0].isEqual(to: cars[1])

关于swift - 如何评估同质集合的平等性?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51377304/

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