如何在实现上替换self

问题描述 投票:1回答:1

我有这个协议

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) {

    }
}
swift generics swift-protocols type-alias associated-types
1个回答
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 :)

© www.soinside.com 2019 - 2024. All rights reserved.