【问题标题】:Swift extension of Sequence to check if an intersection exists快速扩展 Sequence 以检查是否存在交叉点
【发布时间】:2020-02-12 12:59:46
【问题描述】:

我的目标是通过所有Sequence 提供一个函数,例如数组或集合。

这个函数应该返回一个Bool,告诉两个序列中是否至少有一个对象。

// Usage
let s1 = ["hi", "hey", "ho"]
let s2:Set = ["woop", "oi", "yes"]

if s2.intersects(with: s1) {
  print("Happy me, it's a match")
}

extension Sequence where Element:Equatable {
    func intersects<T:Sequence>(with anotherSequence:T) -> Bool
    where T.Element: Equatable {
        //                  ⬇ error: `Extraneous argument label 'where:' in call`
        return self.contains(where: anotherSequence.contains)
    }
}

// doing the same function outside works:
let rez = s1.contains(where: s2.contains)
print(rez)

我觉得我快到了,但我不明白为什么第一个 contains(where:) 会给我这个错误。 contains()contains(where:) 都属于 Sequence 不?

我错过了什么?

【问题讨论】:

    标签: swift sequence swift-extensions


    【解决方案1】:

    我找到了正确的语法,不知道为什么其他语法不起作用:/

    如果有人仍然可以解释为什么其他方式不起作用,那会很有趣?

    extension Sequence where Element:Equatable {
        func intersects<T:Sequence>(with anotherSequence:T) -> Bool
            where T.Element == Self.Element {
            return self.contains(where: anotherSequence.contains)
        }
    }
    

    【讨论】:

    • 我会将方法名称更改为intersects。顺便说一句,您不需要关闭 func intersects&lt;S: Sequence&gt;(with sequence: S) -&gt; Bool where S.Element == Element, Element: Equatable { contains(where: sequence.contains) }
    • 语法没有什么不同,区别在于通用的 where 子句。您的原始实现的问题是 Equatable 仅适用于相同类型的两个实例,因此仅说明两个序列是相等的并不能保证可以检查它们是否相等。但是,将Sequence.Element 设为Equatable 并设为Sequence.Element == OtherSequence.Element 确实保证可以检查它们是否相等。
    • 通过语法我的意思是让它工作的方式,这是一个语言错误对不起。我确实认为通过成为Equatable,它可以让我在任何类型之间进行比较。谢谢你的解释!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-05-20
    • 2018-08-27
    • 2013-05-12
    • 1970-01-01
    • 1970-01-01
    • 2017-11-19
    相关资源
    最近更新 更多