我正在运行Xcode 9,Swift 4,High Sierra。在我的代码中,我有一个映射,剪切和剥离,包括这作为闭包中的第一行:
let foo = graph.edges.map { (edge: Edge<Node>) -> (Int, Int) in
print(edge)
let fromvertex = (edge.from as? VertexElement)
.
.
.
}
let from vertex ...
运行时,代码成功到断点,这是问题开始的地方。如果在那时我在调试器中执行po edge.from
,我得到了预期的结果。如果我走一行,那么执行作业,我得到Thread 1: EXC_BAD_ACCESS (code=2, address=*whatever*)
。然后我可以在那时执行po edge.from
甚至po (edge.from as? VertexElement)
并仍然获得预期的结果。
这怎么可能? edge.from
中没有涉及任何选项,并且我认为自调试器找到数据后数据是否正确。
Edge是(正如您所期望的)泛型类,定义的第一部分是:
public class Edge<T>: NSObject, NSCoding, Codable where T: Hashable {
public typealias Weight = SimWeight
public let from: Vertex<T>
public let to: Vertex<T>
public var weight: Weight? = nil
.
.
.
}
然后,Vertex的第一部分也是通用的,如下所示:
public struct Vertex<T>: Equatable, Codable where T: Hashable {
public var data: T
public let index: Int
public var gridX: Int?
public var gridY: Int?
.
.
.
}
Node是另一个具体的类(不是通用的)
最后,我打开了地址清理工作。
所有这一切,我既没有看到异常的来源,也没有为什么调试器可以在程序无法获取数据时。任何想法有什么不对(甚至如何调试它?)
答案 0 :(得分:0)
我只能怀疑编译器问题,因为现在通过重新组织代码来修复它。具体来说,我在Edge中创建了这个方法:
$b
然后将此帖子顶部的代码更改为:
func indirectEdge() throws -> IndirectEdge {
guard let fromvx = self.from as? VertexElement,
let tovx = self.to as? VertexElement,
let weight = self.weight else {throw TypeError.notVertex}
return IndirectEdge(from: fromvx.index, to: tovx.index, weight: weight)
}
此时一切都开始奏效,没有例外。 (是的,我更改了后面的代码以接受IndirectEdge;该代码更进一步,不应该有任何影响。)我期望的是异常将进入indirectEdge方法,但那是不是发生了什么。代码现在很好用,但可怕的是我无法弄明白为什么。