ios - Playground 因递归值类型而崩溃

标签 ios struct swift xcode6

此代码的 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

[1] https://developer.apple.com/library/ios/documentation/Swift/Conceptual/Swift_Programming_Language/ClassesAndStructures.html

关于ios - Playground 因递归值类型而崩溃,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26347628/

相关文章:

ios - 从底部到顶部动画 UIView 高度

ios - 右图像按钮从右侧对齐 x 点

c - stdlib qsort 对指向结构的指针数组进行排序

c++ - DynamicArray of struct - 添加元素而不创建结构变量/对象

c - 当长度直到运行时才知道时,如何在 C 中声明和初始化这个结构数组?

ios - 如何在没有边界的情况下使两个按钮中心 View 位于中心?

swift - 带圆角的模态面板

ios - 如何将libphonenumber的base.js文件嵌入到iOS项目中

ios - 供应配置文件不包括应用程序标识符和钥匙串(keychain)访问组权利

swift - “Use Legacy Swift Language Version” (SWIFT_VERSION) 发布 Cocoapods 时出错