Как заменить себя на его реализацию - PullRequest
1 голос
/ 10 марта 2019

У меня есть этот протокол

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 Ответ

1 голос
/ 11 марта 2019

Я думаю, что проблема, с которой вы сталкиваетесь, состоит из двух элементов:

  • рекурсивная ссылка на тот же тип, который намекнул компилятор.По сути, вы используете 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:)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...