Доступ к себе в Swift 5.1 Property Wrappers - PullRequest
0 голосов
/ 24 сентября 2019

Я хотел бы создать оболочку свойства, которая делает недействительным макет моего UICollectionViewLayout.

Поэтому я создал эту оболочку свойства

@propertyWrapper
class LayoutInvalidating {
    private let layout: UICollectionViewLayout

    init(layout: UICollectionViewLayout) {
        self.layout = layout
        self.wrappedValue = layout
    }

    var wrappedValue: UICollectionViewLayout {
        didSet {
            self.layout.invalidateLayout()
        }
    }
}

Затем я хотел бы использовать егоследующим образом

final class VehicleControlsCollectionViewLayout: UICollectionViewLayout {
     @LayoutInvalidating(layout: self) // self is not alive
     public var itemSize: CGSize = .init(width: 70, height: 70)
}

Каждый раз, когда устанавливается свойство, я хотел бы вызвать self.invalidateLayout().Любые идеи, как я могу получить доступ к себе, когда оно существует?

1 Ответ

0 голосов
/ 24 сентября 2019

К сожалению, невозможно добавить self к @propertyWrapper s init - это свойство создается при создании self.

Это будет возможно в будущем - посмотрите на предложение ( Ссылка на вложенное «я» в оболочке типа ).


Если вы ищете какой-то обходной путь , вы можете добавить функцию в оболочку вашего свойства и вызывать эту функцию после init в вашем классе:

@propertyWrapper
class LayoutInvalidating<Value> {
    private var layout: UICollectionViewLayout?

    init(wrappedValue: Value) {
        self.wrappedValue = wrappedValue
    }

    func configure(with layout: UICollectionViewLayout?) {
        self.layout = layout
    }

    var wrappedValue: Value {
        didSet {
            layout?.invalidateLayout()
        }
    }
}

final class VehicleControlsCollectionViewLayout: UICollectionViewLayout {
    @LayoutInvalidating
    public var itemSize: CGSize = .init(width: 70, height: 70)

    override init() {
        super.init()
        _itemSize.configure(with: self)
    }
}
...