当实现具体类型时,我的二叉搜索树节点在 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 就会崩溃。
顺便说一句:您会注意到我的代码中的其他一些更改:
data
属性(property)可能应该是不可变的。- 子节点的类型应为
GenericNode<T>
,这样您就可以实际与他们的data
进行比较。 (如果它能够存活足够长的时间,编译器会指出这一点。)
简单的事情
class GenericRootClass<T> {
var data: T?
}
能够使 Xcode 6 beta 2 崩溃。看来通用类目前无法工作。
关于generics - Swift - 无法将 BST 节点转换为通用节点,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24275143/