下面的代码用于SWIFT5.2,可能还适用于SWIFT5.3。(上一次建造是在2020年11月)
@propertyWrapper
class ActionBindable<Button> where Button : UIControl {
var target: Any? {
didSet { setTargetAction() }
}
weak var wrappedValue: Button! {
didSet { setTargetAction() }
}
private let action: Selector
private let event: UIControl.Event
init(action: Selector, event: UIControl.Event = .touchUpInside) {
self.action = action
self.event = event
}
private func setTargetAction() {
guard target != nil && wrappedValue != nil else { return }
wrappedValue.addTarget(target, action: action, for: event)
}
}但是,我现在收到了一个错误:Property type 'UIKit.UIControl?' does not match 'wrappedValue' type 'UIKit.UIControl?'
有一段时间没有跟踪属性包装器了,所以我想知道发生了什么变化。
下面是使用属性包装器的代码:
@ActionBindable(action: #selector(addAction))
var addButton: UIControl!发布于 2022-02-28 01:09:58
我们现在要处理的问题是:
当wrappedValue weak**,是时,没有任何机制可以显式地为使用相关属性包装器的包装变量设置类型。**
你的解决办法是:
// ActionBindable<UIControl>
@ActionBindable(action: #selector(addAction)) var addButton// Any subclasses:
@ActionBindable<UIButton>(action: #selector(addAction)) var addButton不过,我敢打赌您还会遇到其他问题,因为隐式地-未包装的可选性不会在属性包装器之外传播。考虑到你对addButton的定义,我敢打赌过去是这样的。那么,您可能需要一个计算变量来包装addButton,以避免将来的可选检查,这可能会否定使用属性包装器的意义。
https://stackoverflow.com/questions/71289191
复制相似问题