2017-01-15 94 views
0

您好我是Swift的新手,我试图实现一个Graph结构。我定义了Node和Edge结构,现在我试图检查图中是否存在特定的边。类及相关函数是这样的:Swift数组自定义对象包含:需要插入'其中:'

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的抱怨,我应该插入“其中:”在最后陈述中包含。我可以知道这是为什么吗?我的目的只是检查图形中是否存在边缘。映射到元组是因为在Edge实现中还有其他属性;这里只需要检查源节点和目标节点。

+0

什么是'targetSimpleEdge'? – Hamish

+0

一般解释:你是否想将'targetSimpleGraphEdge'传递给'contains'函数? – Keiwan

+1

你应该让你的'Edge'符合'Equatable',这样你就可以摆脱所有这些元组绒毛 – Alexander

回答

1

但Xcode的抱怨,我应该在最后 插入where:包含的语句。我可以知道这是为什么吗?

正如指出的@Keiwan下面,元组不符合Equatable,即使斯威夫特的标准库为我们提供了平等的测试操作==元组最多6名成员,因为所有成员自己符合Equatable ;如下面的斯威夫特演进方案描述后者:

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

但是,您可以利用contains(where:)明确提供关闭,告诉contains如何测试相等性。鉴于您的Node类型符合Equatable,你要修改contains呼叫你的方法的return到:

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

或者,供应谓语尾随封闭:

return simpleGraphEdges.contains { $0 == targetSimpleGraphEdge } 
+4

simpleGraphEdges是不符合'Equatable'的元组列表的实际问题,因此不能直接传入'contains'函数? – Keiwan

1

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

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