Swift 2.0: 无法使用参数列表调用 'setValue'
Swift 2.0: Cannot invoke 'setValue' with an argument list of
我正在将应用程序从 Objective-C 转换为 Swift 2.0,在转换 NSView
子类时,我在尝试存储 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 }
}
我收到错误消息:
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)
。
我正在将应用程序从 Objective-C 转换为 Swift 2.0,在转换 NSView
子类时,我在尝试存储 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 }
}
我收到错误消息:
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)
。