我正在运行 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 是另一个具体类(不是泛型)
最后,我打开了地址清理功能。
尽管如此,我既看不到异常从何而来,也看不到为什么调试器可以在程序无法获取数据时获取数据。任何想法出了什么问题(或者甚至如何调试它?)
最佳答案
我只能怀疑编译器有问题,因为现在通过重新组织代码已修复它。具体来说,我在 Edge 中创建了这个方法:
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)
}
然后将本文顶部的代码更改为:
guard let indirectEdges = try? graph.edges.map({ (edge) throws -> IndirectEdge in
return try edge.indirectEdge()
}) else {throw SimFileError.unimplementedOperation(why: "Don't know how to encode this graph")}
.
.
.
从那时起,一切都开始运转,无一异常(exception)。 (是的,我更改了后面的代码以接受 IndirectEdge;该代码更进一步,不应该产生任何效果。)我预期是异常将转移到 indirectEdge 方法中,但事实就是如此不是发生了什么。代码现在可以工作了,这很好,但可怕的是我不知道为什么。
关于swift - Xcode 如何成功访问程序无法访问的数据?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47686273/