看来你的
description
Node.description
Edge.description
.
Node
呼叫
边缘描述
对于每个边,以及
Edge
呼叫
Node.description
用于其“从”和“到”节点。如果图具有圆形连接,而不是星形连接,则会导致无限roop。
一个简单的方法是
唯一显示
Node.identifier
而不是详细的描述。
class Edge {
var from: Node // does not actually need to be stored!
var to: Node
var weight: Int
var description : String {
return "{ Edge, from: \(from.identifier), to: \(to.identifier), weight: \(weight) }"
}
init(to: Node, from: Node, weight: Int) {
self.to = to
self.weight = weight
self.from = from
}
}
class Node : CustomStringConvertible {
// unique identifier required for each node
var identifier : Int
var distance : Int = Int.max
var edges = [Edge]()
var visited = false
var description: String {
let edgesString = edges.map { $0.description }.joined(separator: ", ")
return "{ Node, identifier: \(identifier), Edges: [\(edgesString)] }"
}
init(visited: Bool, identifier: Int, edges: [Edge]) {
self.visited = visited
self.identifier = identifier
self.edges = edges
}
static func == (lhs: Node, rhs: Node) -> Bool {
return lhs.identifier == rhs.identifier
}
}
let rootNode = Node(visited: false, identifier: 10, edges: [])
var edges: [Edge] = []
for i in 0..<3 {
let node = Node(visited: false, identifier: i, edges: [])
let edge = Edge(to: node, from: rootNode, weight: i)
edges.append(edge)
}
rootNode.edges = edges
print(rootNode)
// { Node, identifier: 10, Edges: [{ Edge, from: 10, to: 0, weight: 0 }, { Edge, from: 10, to: 1, weight: 1 }, { Edge, from: 10, to: 2, weight: 2 }] }
visited
成员),并尝试不访问那些已访问的节点。