【发布时间】:2023-03-20 02:38:01
【问题描述】:
我正在尝试创建一个实用程序来添加闭包作为 UIControls 的事件处理程序,尽管我遇到了一些问题,这里是代码:
public func addCallBack(callback: Void -> Void, forControlEvents events: UIControlEvents)
{
var optClosureDict = objc_getAssociatedObject(self, &UIControlClosureDictKey) as? Dictionary<UInt, Set<ClosureWrapper>>
if optClosureDict == nil {
optClosureDict = Dictionary<UInt, Set<ClosureWrapper>>()
}
var closureDict = optClosureDict!
if closureDict[events.rawValue] == nil {
closureDict[events.rawValue] = Set<ClosureWrapper>()
}
var closures = closureDict[events.rawValue]!
let wrapper = ClosureWrapper(callback:callback)
addTarget(wrapper, action:"invoked", forControlEvents: events)
closures.insert(wrapper)
objc_setAssociatedObject(self, &UIControlClosureDictKey, optClosureDict!, .OBJC_ASSOCIATION_RETAIN_NONATOMIC)
var res = objc_getAssociatedObject(self, &UIControlClosureDictKey) as? Dictionary<UInt, Set<ClosureWrapper>>
}
1) 两个 if 语句看起来都很难看,我调用了一个返回可选的 API,如果它是 nil,我想用一些默认值覆盖它,那么我必须强制解包它。有没有更惯用的“Swifter”方式来做到这一点?
2) 同样,当我创建一个具有一个 int 键值对的闭包字典时,我使用 setAssociatedObject 将其存储,然后我在 getAssociatedObject 中检索回来的内容,我得到一个包含 0 个键值对的字典。到底是怎么回事?这是一个问题,因为我的closureWrapper 没有被保留并且整个事情都没有工作
【问题讨论】:
标签: objective-c swift