- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我希望 CustomStringConvertible 为我提供节点的描述,特别是它包含的边。
作为背景,我一直在研究图论并创建了一个节点:
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 {
return "identifier: " + identifier.description + ", 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
}
}
有边
class Edge {
var from: Node // does not actually need to be stored!
var to: Node
var weight: Int
var description : String {
return "from: " + from.description + ", to: " + to.description + ", weight: " + weight.description
}
init(to: Node, from: Node, weight: Int) {
self.to = to
self.weight = weight
self.from = from
}
}
我可以很容易地打印出每个节点的每条边
testGraph.nodes.forEach { $0.edges.forEach{ print ($0.description)}}
但是我无法通过节点的描述来实现 in。
我尝试为每个语句写出与我的等效的内容
var description: String {
var edgesString = String()
edges.forEach{ edgesString.append($0.description)}
return "identifier: " + identifier.description + ", Edges: " + ( edgesString )
}
但在这种情况下,执行会给出 EXC_BAD_ACCESS,实际上我无法完成任何代码,也无法提供节点的描述和其中包含的边。
如何完成节点的描述字符串,然后继续描述边?
最佳答案
您的description
代码似乎会导致Node.description
和Edge.description
无限循环。
Node
为每条边调用 Edge.description
,Edge
为它的 from 和到节点。如果图有循环连接,而不是星形连接,则会导致无限循环。
一个简单的方法是Edge.description
只显示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
成员),尽量不要访问那些访问过的节点。
关于具有复杂类型的 Swift CustomStringConvertible,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54394405/
如何创建一个协议(protocol)或类型,在实例化时接受所有类型的类型,如 Int、Double、String、NSDate 等(如 CustomStringConvertible)? 第一个 bl
我已经在 swift 中实现了一个链表 - 我还构建了一个堆栈和队列,它们都在底层使用了链表。我扩展了链接列表以符合 customstringconvertible 协议(protocol),这样我就
我在 XCode playground 中为我的 enum 使用 CustomStringConvertible 时遇到了一个非常奇怪的问题。 请参阅以下枚举: enum A { case v
我希望 CustomStringConvertible 为我提供节点的描述,特别是它包含的边。 作为背景,我一直在研究图论并创建了一个节点: class Node : CustomStringConv
我整理了以下类(class)(在 Swift variable comparison where type is not known 中其他人的帮助下)。 我想要实现的是将一个闭包传递给 Search
我正在实现 try catch 枚举: enum processError: Error, CustomStringConvertible { case one var
我在 Xcode Playground 中尝试这段代码并注意到 description getter 方法被调用了太多次。 代码在这里:https://gist.github.com/T-Pham/4
我有以下枚举 enum Properties: CustomStringConvertible { case binaryOperation(BinaryOperationProperties
这个问题在这里已经有了答案: Using os_log to log function arguments, or other dynamic data (5 个答案) 关闭 4 年前。 我想知道我
我想在协议(protocol)扩展中为我的协议(protocol)实现一个可打印的功能,然后将根据协议(protocol)的字段打印任何符合协议(protocol)的结构。但是我得到了以下错误,似乎
我已经声明了以下内容: class Song: CustomStringConvertible { let title: String let artist: String i
我想要一个可以实例化几个不同对象的通用函数enum我通过提供枚举类型和 Int原始值(value)。这些enum s 也是 CustomStringConvertible . 我试过这个: func
我想为给定的类型实现类似于 CustomStringConvertible 的协议(protocol),但例如。 我的需要是显示类型属性 值,而无需为此目的创建实例评估器。当然,我可以向此类型添加 C
我想通过添加一些额外的输出来扩展我的 class 中 CustomStringConvertible 协议(protocol)的默认行为。 例如,假设您在名为 Bar 的项目中有这个 class: c
我在 iOS playground 中写了一个结构体,想自定义它的打印格式。 struct Point { let x: Int, y: Int } extension Point: Cust
在这里,我尝试对我的 distinct 函数进行基准测试,该函数接收随机对象数组并返回不同的数组,方法是通过 phoneNumber 属性删除重复项:当我为我的 Person 类实现 CustomSt
当枚举符合协议(protocol) CustomStringConvertible 时,是否可以从变量中获取枚举描述?简化的定义是: enum myEnum: CustomStringConverti
我正在尝试编写一个函数,该函数接受任何可由 CustomStringConvertible 表示的 RawRepresentable 值。我试过这样写: enum MyEnum: String {
我正在试用 XCGLogger 并注意到,如果我有一个日志语句,其中包含来自同时实现 CustomDebugStringConvertible 和 CustomStringConvertible 的类
在 Swift 2.2 中,提供的协议(protocol) CustomStringConvertible 提供了一个返回字符串表示的计算属性。通常,它用于简单数据类型的简短单行字符串表示。 是否有类
我是一名优秀的程序员,十分优秀!