2017-01-15 128 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 
    }) 
} 
相關問題