Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/swift/17.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Swift 如何获得实现equalable的序列?_Swift_Sequence_Equatable - Fatal编程技术网

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(如果您创建了您想要的)?他们返回不同的东西。