【问题标题】:Swift 2.0: Cannot invoke 'setValue' with an argument list ofSwift 2.0:无法使用参数列表调用“setValue”
【发布时间】: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


    【解决方案1】:

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

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


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

    【讨论】:

    • 我确实考虑过并且已经尝试过(出于某种愚蠢的原因,我从问题中删除了该细节)。无论如何,我刚刚尝试了这两种方法(@objc class WeakReference 和使用NSValue(nonretainedObject: self)),我得到了同样的错误。
    • 是的;就是这样。使用setValue(value, forKey:key) 有效。非常感谢并感谢您提供有关NSValue 的提示(这些年来我从未知道NSValue 的用途)。
    猜你喜欢
    • 1970-01-01
    • 2015-08-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多