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

Swift 2.0: Cannot invoke 'setValue' with an argument list of

我正在将应用程序从 Objective-C 转换为 Swift 2.0,在转换 NSView 子类时,我在尝试存储 weak 时遇到错误从 CALayerActionViewItemInternal 的反向引用是必需的,以便图层绘制代码可以访问项目数据。我想使用 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)'

setValue(_:forKey:) 方法需要一个 ObjC 对象作为值——您传递的是一个纯 Swift class 的实例。如果您使 WeakReference class 用 @objc 注释或从 NSObject 继承,那么调用应该会成功。

但是,您不需要自己的 class 来实现此目的... NSValue 方法 valueWithNonretainedObject 做同样的事情。


哦,仔细检查一下:您在调用中使用了额外的参数标签。它应该像 setValue(myvalue, forKey: mykey)