Оборачивание существующей переменной экземпляра в мутирующий PropertyWrapper - PullRequest
0 голосов
/ 25 октября 2019

Я пытаюсь по существу сделать @PropertyWrapper действовать как получатели и установщики для существующих частных членов экземпляра. Ниже у меня есть мой WIP. Проблема в том, что я не могу ссылаться на члена экземпляра, так как не могу получить доступ к себе. Оболочки не могут быть ленивыми, и ленивый член не помогает. У меня есть эта тема (https://twitter.com/jckarter/status/1161298507527000064) и эта часть предложения быстрой эволюции (https://github.com/apple/swift-evolution/blob/master/proposals/0258-property-wrappers.md#referencing-the-enclosing-self-in-a-wrapper-type),), но я просто не получаю ее. Любой совет?

@propertyWrapper
struct PrivateWrapper<MemberOwner: AnyObject, MemberListener> {
    var privateVar: MemberOwner
    var member: ReferenceWritableKeyPath<MemberOwner, MemberListener>

    var wrappedValue: MemberListener {
        get {
            return privateVar[keyPath: member]
        }
        mutating set {
            privateVar[keyPath: member] = newValue
        }
    }
}

class A {
    var memberA: String
    var memberB: Int

    init(_ a: String, _ b: Int) {
        memberA = a
        memberB = b
    }
}

class B {
    private var aInst = A("Hello", 0)
    // Both wrappers get the following error:
    // "Cannot use instance member 'aInst' within property initializer; 
    // property initializers run before 'self' is available"
    @PrivateWrapper(privateVar: aInst, member: \A.memberA) var newAString: String
    @PrivateWrapper(privateVar: aInst, member: \A.memberB) var newBInt: Int 
}

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