【问题标题】:Problems initializing a class in Swift在 Swift 中初始化类的问题
【发布时间】:2020-10-13 04:06:48
【问题描述】:

我正在尝试为二叉树编写一个类。树类本身只有指向根节点的指针,然后树内的节点指向其他节点。根据树的应用,我是每个节点也有用户指定的类型数据,所以我将节点类设为通用类型 T。由于节点类在 T 中是通用的,在我看来我必须制作树T 中的泛型类也是如此,因此我可以将 T 传递给我在创建树时创建的一个空节点。

这是我的测试代码:

enum NodeKind {
  case notAssigned
  case leaf
  case tree
}

class Node<T> {
  var kind  = NodeKind.notAssigned
  var parent: Node<T>?   // if a tree node, pointer to parent node, else nil
  var child0: Node<T>?   // if a tree node, points to a child if it exists, else nil
  var child1: Node<T>?   // optionals are automatically inited to nil
  var data:   T          // data type of the user data
  
  init( data: T) {
    self.data = data
  }
}

class BinaryTree<T> {
  var root: Node<T>  // pointer to the root of the binary tree
  
  init( data: T) {
    root = Node<T>( data: T)  // create one empty node at the root
  }
}

var testTree = BinaryTree<Int>( data: 5)

我的意图是最后一条语句应该创建一个 BinaryTree 实例,其中的节点包含 Int 类型的用户数据,并且 var testTree 的根应该指向一个具有数据 == 5 且没有子节点和父节点的单个节点实例。

但是,最后一行出现编译器错误:

Cannot convert value of type 'T.Type' to expected argument type 'T'

有各种建议的修复方法,但都没有奏效。这个要怎么写?

其次,“T.Type”是什么意思?我不熟悉这个结构。

谢谢,埃里克

【问题讨论】:

    标签: swift class generics


    【解决方案1】:

    第一个问题:

    在您的BinaryTree 类的初始化程序中,我假设您正在尝试创建一个新的Node&lt;T&gt; 来存储data 类型的data 输入。但是,您将T 类型分配给data,而不是实际的data 本身。

    要解决此问题,请更改 BinaryTree 类的初始化程序:

    init(data: T) {
        root = Node<T>(data: data)  // create one empty node at the root
    }
    

    第二个问题

    T.Type 表示事物本身的类型(在本例中为 Int),但不是该事物的实例(在本例中为 5)。

    【讨论】:

    • 是的,谢谢,解决了。我觉得我应该抓住它,但看不到它。感谢您回答这两个问题。
    猜你喜欢
    • 1970-01-01
    • 2020-10-17
    • 1970-01-01
    • 1970-01-01
    • 2021-01-17
    • 1970-01-01
    • 2021-08-31
    • 1970-01-01
    • 2019-10-04
    相关资源
    最近更新 更多