我正在将一个应用程序从Objective-C转换为Swift 2.0并在转换NSView
- 子类时,我在尝试存储来自{{1}的weak
反向引用时收到错误到所需的CALayer
,以便图层绘制代码可以访问项目数据。我想使用ActionViewItemInternal
引用以避免保留周期(项目对象保留图层,因此图层需要弱引用回到项目对象)。
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 }
}
Xcode版本:Xcode 7.0 beta 1.尝试部署目标:10.9,10.10和10.11。
编辑:我已按照@ rickster的建议尝试使用ActionView.swift:73:19: Cannot invoke 'setValue' with an argument list of type '(value: WeakReference, forKey: String)'
,但错误仍然存在:
NSValue
答案 0 :(得分:4)
setValue(_:forKey:)
方法需要一个ObjC对象作为值 - 您正在传递一个纯Swift类的实例。如果您使WeakReference
课程注明了@objc
或继承自NSObject
,则该调用应该成功。
但是,无论如何你都不需要自己的类... NSValue
方法valueWithNonretainedObject
做同样的事情。
哦,仔细观察:你在通话中使用了额外的参数标签。它应该像setValue(myvalue, forKey: mykey)
。