Swift 2.0:无法调用' setValue'参数列表

时间:2015-06-12 19:13:15

标签: macos swift key-value-coding

我正在将一个应用程序从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

1 个答案:

答案 0 :(得分:4)

setValue(_:forKey:)方法需要一个ObjC对象作为值 - 您正在传递一个纯Swift类的实例。如果您使WeakReference课程注明了@objc或继承自NSObject,则该调用应该成功。

但是,无论如何你都不需要自己的类... NSValue方法valueWithNonretainedObject做同样的事情。

哦,仔细观察:你在通话中使用了额外的参数标签。它应该像setValue(myvalue, forKey: mykey)