【问题标题】:Access self in Swift 5.1 Property Wrappers在 Swift 5.1 属性包装器中访问 self
【发布时间】:2020-01-24 12:53:44
【问题描述】:

我想创建一个属性包装器,它使我的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()。有什么想法可以在 self 存在时访问它吗?

【问题讨论】:

    标签: swift swift5.1


    【解决方案1】:

    很遗憾,无法将self 添加到@propertyWrappers init - 此属性是在创建self 期间创建的。

    这将在未来成为可能 - 看看 proposal在包装器类型中引用封闭的“自我”)。


    如果您正在寻找某种解决方法,您可以考虑将函数添加到您的属性包装器并在您的类中初始化之后调用此函数:

    @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)
        }
    }
    

    【讨论】:

      猜你喜欢
      • 2020-03-11
      • 1970-01-01
      • 2017-03-04
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-08-09
      • 1970-01-01
      相关资源
      最近更新 更多