свойство 'let' не может быть инициализировано напрямую; используйте взамен "self.init (...)" или "self = ..." - PullRequest
0 голосов
/ 14 января 2019

Я хочу попробовать написать значение по умолчанию init в protocol расширении, поэтому я сделал это:

protocol P {
    var data: [AnyHashable: Any] { get }
    init(_ s: String)
}

extension P {
    init(_ s: String) {
        self.data = ["s": s]
    }
}

Но я получаю эту ошибку:

свойство 'let' data 'не может быть инициализировано напрямую; используйте взамен "self.init (...)" или "self = ..."

Понятия не имею, что это значит. Спасибо за вашу помощь!

Ответы [ 2 ]

0 голосов
/ 14 января 2019
import PlaygroundSupport

protocol P {
    var data: [AnyHashable: Any] { get }
    var _data: [AnyHashable: Any] { get set }
    static func generator(_ s: String) -> P
    init()
}

extension P {
    static func generator(_ s: String) -> P {
        var p = self.init()
        p._data = ["s": s]
        return p
    }
}

class A: P {
    required init() { }
    var data: [AnyHashable : Any] {
        return _data
    }
    var _data: [AnyHashable : Any] = [:]
}

let a = A.generator("some")
print(a.data)

PlaygroundPage.current.finishExecution()

Я думаю, что это самый близкий вам код. Проблема в том, что _data является общим для других классов.

0 голосов
/ 14 января 2019

Ошибка говорит о том, что переменная не может быть инициализирована в расширении протокола, потому что она объявлена ​​как константа { get }

Но даже если вы объявите переменную { get set }, вы все равно не сможете использовать метод init без ограничения конкретного типа или связанного с ним типа.

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