此代码的 Xcode playground 崩溃 - 如果在项目中它会阻止编译。
我试图声明一个非常简单的结构:
struct Node<T> {
let value: T
var next: Node<T>?
init(_ value: T) {
self.value = value
next = nil
}
}
如果我在 XCode playground 中这样做,我会收到以下错误消息:与 playground 服务的通信意外中断。
如果我在 XCode 的单独文件中声明此结构,则无法编译该项目。在这种情况下,我得到的只是Command failed due to signal: Segmentation fault: 11。
有人可以帮我解决这个问题吗?有解决方法吗?非常感谢任何帮助。
最佳答案
引用 swift 文档,“结构在代码中传递时总是被复制,并且不使用引用计数。” [1]
您尝试实现的链表通过在当前节点上存储指向下一个节点的指针或引用来工作。这样,每个节点都具有相同的大小。另一方面,Swift 的结构不是引用类型。每个节点的大小将根据它必须递归存储多少个节点而有所不同。
实现您尝试使用 struct 执行的操作的一种方法是使用 UnsafeMutablePointer
。我不需要警告你,因为在 swift 中这样做会让你每隔几行就写上“不安全”。
struct Node<T> {
var x: T
// Setting pointer type to <Node<T>> compiles, but infinite loops on runtime (Swift 1.2)
var next: UnsafeMutablePointer<Void>
}
var second = Node(x: 2, next: nil)
var first = Node(x: 1, next: &second)
print(unsafeBitCast(first.next, UnsafeMutablePointer<Node<Int>>.self).memory.x) // Prints 2
关于ios - Playground 因递归值类型而崩溃,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26347628/