Я думаю, что проблема, с которой вы сталкиваетесь, состоит из двух элементов:
рекурсивная ссылка на тот же тип, который намекнул компилятор.По сути, вы используете struct
, размер которого должен быть известен во время компиляции;добавление рекурсивной ссылки к его типу предотвращает использование
при использовании «Self» в объявлении протокола, что может привести к случаям, когда создаются не полностью инициализированные экземпляры (см .: Протокол возврата функции 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:)