Swift 如何获得实现equalable的序列?
我有以下最佳尝试:Swift 如何获得实现equalable的序列?,swift,sequence,equatable,Swift,Sequence,Equatable,我有以下最佳尝试: extension Equatable where Self: Sequence, Self.Element: Equatable { public static func == (lhs: Self, rhs: Self) -> Bool { return lhs.elementsEqual(rhs) } } 但它似乎不起作用。此外,它要求两个序列具有相同的确切类型,而我只想约束它们的元素类型是相同的。有什么方法可以做到这一点吗?协议
extension Equatable where Self: Sequence, Self.Element: Equatable {
public static func == (lhs: Self, rhs: Self) -> Bool {
return lhs.elementsEqual(rhs)
}
}
但它似乎不起作用。此外,它要求两个序列具有相同的确切类型,而我只想约束它们的
元素
类型是相同的。有什么方法可以做到这一点吗?协议从不与其他协议一致。协议可能需要其他协议(我们通常称之为“协议继承”),但这并不能使协议符合其他协议。协议甚至不符合自身,更不用说其他东西了<代码>序列。无法将self传递给需要序列的对象。键入
在任何情况下,equalable都要求被比较的对象是同一类型的。“相等”的其他含义是不相等的
如果您想在“这两个序列具有相同的元素”的基础上构建方法,这很好。这就是elementsEqual
为您所做的。但这并不能让他们平起平坐
您正在尝试构建什么算法来使用这个和那个elementEqual
尚未处理的
有可能您正在寻找的只是一些语法糖,使其看起来像=
。那没问题。您可以构建要实现的任何操作符elementsEqual
infix operator ~=
func ~= <S1, S2>(lhs: S1, rhs: S2) -> Bool
where S1: Sequence, S2:Sequence,
S1.Element: Equatable, S1.Element == S2.Element
{
return lhs.elementsEqual(rhs)
}
中缀运算符~=
func~=(左:S1,右:S2)->Bool
其中S1:序列,S2:序列,
S1.Element:equalable,S1.Element==S2.Element
{
返回左侧元件顺序(右侧)
}
我通常不建议使用自定义运算符,但是如果您正在做大量此类工作,那么显式的“这些序列在相同顺序中具有相等的值”运算符可能非常有用。您只是不想使用
==
,因为这已经意味着一些并不意味着的东西。例如,两个集合可能是=
,但不是~=
,因此您需要选择您所指的工具。协议从不符合其他协议。协议可能需要其他协议(我们通常称之为“协议继承”),但这并不能使协议符合其他协议。协议甚至不符合自身,更不用说其他东西了<代码>序列。无法将self传递给需要序列的对象。键入
在任何情况下,equalable都要求被比较的对象是同一类型的。“相等”的其他含义是不相等的
如果您想在“这两个序列具有相同的元素”的基础上构建方法,这很好。这就是elementsEqual
为您所做的。但这并不能让他们平起平坐
您正在尝试构建什么算法来使用这个和那个elementEqual
尚未处理的
有可能您正在寻找的只是一些语法糖,使其看起来像=
。那没问题。您可以构建要实现的任何操作符elementsEqual
infix operator ~=
func ~= <S1, S2>(lhs: S1, rhs: S2) -> Bool
where S1: Sequence, S2:Sequence,
S1.Element: Equatable, S1.Element == S2.Element
{
return lhs.elementsEqual(rhs)
}
中缀运算符~=
func~=(左:S1,右:S2)->Bool
其中S1:序列,S2:序列,
S1.Element:equalable,S1.Element==S2.Element
{
返回左侧元件顺序(右侧)
}
我通常不建议使用自定义运算符,但是如果您正在做大量此类工作,那么显式的“这些序列在相同顺序中具有相等的值”运算符可能非常有用。您只是不想使用
==
,因为这已经意味着一些并不意味着的东西。例如,两个集合可能是=
,但不是~=
,因此您需要选择您所指的工具。注意,两个序列相等并不意味着元素序列相等
–例如,两个相等的集合
值可能包含相同的元素,但顺序不同,在这种情况下,elementsEqual
返回false。请注意,两个序列相等并不意味着elementsEqual
–例如,两个相等的Set
值可能包含相同的元素,但顺序不同,哪种情况下elementsEqual
返回false。轻微挑剔:一些协议符合自身,例如@objc
没有静态要求的协议,最近在Swift 5中错误
符合自身(这就是允许结果
)。如果您使用惰性序列,则确定两个序列是否相等是一个非常常见的问题,并且将它们转换为数组是无性能的elementsEqual
可以工作,但没有什么那么优雅?如果您的意思是elementsEqual
,那么这就是正确的工具。当然,您可以在此基础上构建其他工具来表示更复杂的算法,但您不能表示Equatable,因为这有一个特定的含义,即它不是。如果您说的是set1==set2
,您是希望它执行Set的典型==代码,还是希望它运行elementsEqual(如果您创建了您想要的)?它们返回不同的东西。稍微吹毛求疵:一些协议符合自身,例如@objc
没有静态要求的协议,最近在Swift 5中,Error
符合自身(这就是允许结果的原因)。如果您使用惰性序列,则确定两个序列是否相等是一个非常常见的问题,并且将它们转换为数组是无性能的elementsEqual
可以工作,但没有什么那么优雅?如果您的意思是elementsEqual
,那么这就是正确的工具。当然,您可以在此基础上构建其他工具来表示更复杂的算法,但您不能表示Equatable,因为这有一个特定的含义,即它不是。如果您说的是set1==set2
,您是希望它执行Set的典型==代码,还是希望它运行elementsEqual(如果您创建了您想要的)?他们返回不同的东西。