如何取代自我实现

时间:2019-03-09 22:57:28

标签: swift generics swift-protocols type-alias associated-types

我有这个协议

protocol BinaryTreeProtocol {
    associatedtype T
    var info: T { get set }
    var left: Self? {get set}
    var right: Self? {get set}
    func addItem(item: T)
}

我无法完成其实现。

struct BinaryTreeImplementation: BinaryTreeProtocol {
    typealias T = Int
    var info: Int

    var left: BinaryTreeImplementation?  // There is an error here.
    var right: BinaryTreeImplementation? // how can I sort it?

    func addItem(item: Int) {

    }
}

1 个答案:

答案 0 :(得分:1)

我认为您面临的问题有两个要素:

  • 对与编译器提示的类型相同的递归引用。基本上,您使用的是struct,在编译时应该知道其大小;向其类型添加递归引用可以防止这种情况

  • 您在协议声明中使用“ Self”,这可能会导致创建未完全初始化的实例的情况(请参阅:Protocol func returning Self);也就是说,您需要使用final进行实施,以确保Self实例属于特定类并因此被完全初始化;

我已经修改了反映我的评论的代码:

protocol BinaryTreeProtocol {
   associatedtype T
   var info: T { get set }
   var left: Self? {get set}
   var right: Self? {get set}
   func addItem(item: T)
}


final class BinaryTreeImplementation: BinaryTreeProtocol {
   typealias T = Int
   var info: Int = 0

   var left: BinaryTreeImplementation?
   var right: BinaryTreeImplementation?

   func addItem(item: Int) {

   }
}

希望这会有所帮助,并享受Swift:)