Swift 如何在其实现上取代self

Swift 如何在其实现上取代self,swift,generics,swift-protocols,type-alias,associated-types,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 { typeal

我有这个协议

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

    }
}

我认为你面临的问题有两个方面:

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

  • 您在协议声明中使用“Self”,这可能导致创建非完全初始化实例的情况(请参阅:);i、 e您需要使用
    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:)

您不能拥有包含itself@LeoDabus即使它是可选的,也没有任何区别使用类而不是结构。