generics - Swift - 无法将 BST 节点转换为通用节点

标签 generics swift

当实现具体类型时,我的二叉搜索树节点在 Playground 上运行良好:

class Node {
    var data: Int
    var leftChild: Node?
    var rightChild: Node?

    init(data: Int){
        self.data = data
    }
}

let n = Node(data: 42)      // {data 42 nil nil}

当我尝试使其通用时,Xcode 崩溃并烧毁:

class GenericNode<T: Comparable> {
    var data: T
    var leftChild: GenericNode?
    var rightChild: GenericNode?

    init(data: T){
        self.data = data
    }
}

let g = GenericNode<Int>(data: 42)

当逐行输入时,Xcode 会一直存在,直到我在 init 中输入实际分配为止。 。我尝试指定 <AnyObject: Comparable> ,但显然对 AnyObject 添加了约束不允许。如何在 Swift 中制作适当约束的通用容器?

最佳答案

这里肯定有一些错误。此代码不会崩溃:

class GenericRootClass {
}

class GenericNode<T: GenericRootClass where T : Comparable> {

    let data: T
    var leftChild: GenericNode<T>?
    var rightChild: GenericNode<T>?

    init(data: T) {
        self.data = data
    }
}

但是一旦我删除类型约束中的 GenericRootClass 或将其更改为 Any 或 AnyObject,Xcode 就会崩溃。

顺便说一句:您会注意到我的代码中的其他一些更改:

  1. data属性(property)可能应该是不可变的。
  2. 子节点的类型应为 GenericNode<T> ,这样您就可以实际与他们的 data 进行比较。 (如果它能够存活足够长的时间,编译器会指出这一点。)

简单的事情

class GenericRootClass<T> {
    var data: T?
}

能够使 Xcode 6 beta 2 崩溃。看来通用类目前无法工作。

关于generics - Swift - 无法将 BST 节点转换为通用节点,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24275143/

相关文章:

ios - 当我的 UIViewController 在我的 Swift 应用程序中显示给用户时,如何检查它是否被查看?

ios - 下载前获取图片尺寸

ios - Swift 中的 4 x 2 按钮键盘

c# - C# 中泛型类型的命名空间范围别名

java - 过滤泛型类型列表

scala - 通用 "nested members"特征

swift - 如何快速将自己转换为 UnsafeMutablePointer<Void> 类型

ios - 为什么反转函数参数的 bool 结果会在 Swift 中产生编译器错误?

java - 将各种类型的函数应用于值

ios - 将 ViewController 与 swift 中的类型进行比较