【发布时间】:2015-06-12 19:13:15
【问题描述】:
我正在将应用程序从 Objective-C 转换为 Swift 2.0,并且在转换 NSView-子类时,尝试将 weak 反向引用从 CALayer 存储到 @987654324 时出现错误@ 这是必需的,以便图层绘制代码可以访问项目数据。我想使用weak 引用以避免保留循环(项目对象保留层,因此层需要对项目对象的弱引用)。
class WeakReference {
weak var reference: AnyObject?
init(reference: AnyObject) {
self.reference = reference
}
}
class ActionView: NSView {
// Used to store an item in ActionView.items
private class ActionViewItemInternal {
var actionViewItem: ActionViewItem
var layer: CALayer
...
init(withItem actionViewItem: ActionViewItem) {
self.actionViewItem = actionViewItem
let layer = CALayer()
// !!!!!!!!!!!!!!!!!!!!!!!!!!
// other init and error here:
// !!!!!!!!!!!!!!!!!!!!!!!!!!
layer.setValue(value: WeakReference(reference: self), forKey: "ActionViewItem")
self.layer = layer
}
}
var items: [ActionViewItem] = [ActionViewItem]()
...
}
其中ActionItemView定义为:
@objc protocol ActionViewItem {
var name: String { get set }
var icon: NSImage { get set }
var enabled: Bool { get set }
}
我收到错误:
ActionView.swift:73:19: Cannot invoke 'setValue' with an argument list of type '(value: WeakReference, forKey: String)'
Xcode 版本:Xcode 7.0 beta 1. 尝试的部署目标:10.9、10.10 和 10.11。
编辑:按照@rickster 的建议,我已尝试使用NSValue,但错误仍然存在:
layer.setValue(value: NSValue(nonretainedObject: self), forKey: "ActionViewItem")
ActionView.swift:72:19: Cannot invoke 'setValue' with an argument list of type '(value: NSValue, forKey: String)'
【问题讨论】:
标签: macos swift key-value-coding