Подтвердить что ты не робот

Проблемы с самонастраиванием внутренних расширений протокола Swift с инициализацией

Я ищу способ добавить инициализатор по умолчанию к протоколу через расширения протокола.

Мой протокол:

protocol TestProtocol {
    var myVar : Double { get set }
    init(value: Double)
    init(existingStruct : TestProtocol)
}

Я реализовал структуру, используя этот протокол, как:

struct TestStruct : TestProtocol {
    var myVar : Double

    init(value : Double) {
        myVar = value
    }

    init (existingStruct : TestProtocol) {
        myVar = existingStruct.myVar
    }
}

Однако, если я попытаюсь через расширение сделать инициализатор по умолчанию для этого протокола, я столкнусь с проблемами:

extension TestProtocol {
    init(value : Double) {
        myVar = value
    }

    init(existingStruct : TestProtocol) {
        myVar = existingStruct.myVar
    }
}

Если обе строки присваивания выдают ошибку Переменная 'self' передается по ссылке перед инициализацией

Есть ли способ сделать эту работу - или ограничено ли я использованием классов?

enter image description here

4b9b3361

Ответ 1

Ваш вопрос почти такой же, как в этом сообщении, который я ответил вчера.

Вот трюк, чтобы решить эту проблему:)

protocol TestProtocol {
    var myVar : Double { get set }
    init() // designated initializer which will ensure that your class or structer type will instantiate correctly
}

struct TestStruct : TestProtocol {
    var myVar : Double

    init() {
        myVar = 0
    }
}

extension TestProtocol {
    init(value : Double) {
        self.init()
        myVar = value
    }

    init(existingStruct : TestProtocol) {
        self.init()
        myVar = existingStruct.myVar
    }
}

Хорошего дня.:) Расширение протокола так приятно.