【问题标题】:Swift Array of Self-defined Objects Contains: Requires to Insert 'where:'自定义对象的 Swift 数组包含:需要插入 'where:'
【发布时间】:2017-05-30 15:06:15
【问题描述】:

您好,我是 Swift 新手,我正在尝试实现一个 Graph 结构。我已经定义了 Node 和 Edge 结构,现在我正在尝试检查图中是否存在特定的边。类和相关函数是这样的:

class Graph<T: Equatable> {
    private var storedNodes = [Node]()
    private var storedEdges = [Edge]()

    func containsSimpleGraphEdge(targetEdge: Edge) -> Bool {
        let simpleGraphEdges = self.storedEdges.map({edge in (edge.source, edge.dest)})
        let targetSimpleGraphEdge = (targetEdge.source, targetEdge.dest)
        return simpleGraphEdges.contains(targetSimpleGraphEdge)
}

但是 Xcode 抱怨我应该在最后一个 contains 语句中插入 'where:'。我可以知道为什么会这样吗?我的目的只是检查图中是否存在边。映射到元组是因为在 Edge 实现中还有其他属性;这里只需要检查源节点和目的节点。

【问题讨论】:

  • targetSimpleEdge 是什么?
  • 一般说明:您的意思是要将targetSimpleGraphEdge 传递给contains 函数吗?
  • 你应该让你的Edge符合Equatable这样你就可以摆脱所有这些元组绒毛
  • 另外,可能值得将其命名为 UndirectedGraphDirectedGraph(它们可能都是抽象 Graph 的子类)。

标签: arrays swift contains


【解决方案1】:

但是 Xcode 抱怨我应该在最后插入 where: 包含声明。我可以知道为什么会这样吗?

正如下面@Keiwan 所指出的,元组不符合Equatable,即使Swift 的标准库为我们提供了相等性测试运算符== 用于最多6 个成员的元组,因为所有成员本身都符合@ 987654328@;后者如以下 Swift Evolution 提案中所述:

因此,您尝试调用contains(_:) 失败为this method is not accessible for non-Equatable elements

但是,您可以使用contains(where:) 显式提供一个闭包,告诉contains 如何测试相等性。鉴于您的Node 类型符合Equatable,您需要将方法的return 中的contains 调用修改为:

return simpleGraphEdges.contains(where: { $0 == targetSimpleGraphEdge })
    // note also your typo here, 'targetSimpleEdge' should be 'targetSimpleGraphEdge'

或者,提供谓词作为尾随闭包:

return simpleGraphEdges.contains { $0 == targetSimpleGraphEdge }

【讨论】:

  • simpleGraphEdges是元组列表,不符合Equatable,因此不能直接传入contains函数,这不是实际的问题吗?跨度>
【解决方案2】:

如果您不想使Edge 可相等(例如当它具有多个与上下文相关的“相等”定义时),您可以只使用contains(where:)

func contains(simpleGraphEdge e: Edge) -> Bool {
    return self.storedEdges.contains(where: {
        $0.source == e.source && $0.dest == e.dest
    })
}

【讨论】:

    猜你喜欢
    • 2013-08-10
    • 1970-01-01
    • 2020-11-12
    • 1970-01-01
    • 2019-07-09
    • 2016-05-28
    • 2021-09-27
    • 1970-01-01
    • 2019-02-23
    相关资源
    最近更新 更多