下面是我的问题的一个简单的例子:
class Test: NSObject {
func metaHandler(name elementName: String, attributes attr : NSDictionary) -> NSNumber
{
return NSNumber.init()
}
var metaHandlerFunc: ((String, NSDictionary) -> NSNumber) = metaHandler
}当我将函数赋给var时,我得到了一个编译器错误:
Cannot convert value of type '(Test) -> (String, NSDictionary) -> NSNumber' to specified type '(String, NSDictionary) -> NSNumber'我的例子似乎与我在其他地方看到的完全一样。有什么建议吗?
我正在运行Xcode10.3。
发布于 2020-07-05 02:20:26
您已经将metaHandler定义为实例方法,即应用于Test的具体实例的方法。因此,它具有以下签名
(Test) -> (String, NSDictionary) -> NSNumber有关示例Instance Methods are “Curried” Functions in Swift,请参阅。
将其定义为“类型方法”(使用class或static)可以解决这个问题:
static func metaHandler(...)现在它有了签名(String, NSDictionary) -> NSNumber,可以分配给var metaHandlerFunc了。
如果应该允许重写子类中的方法,请选择class func。
发布于 2020-07-05 02:49:57
问题是您试图将一个实例函数赋给一个实例变量,这意味着该实例应该在赋值之前进行初始化。
顺便说一下,我得到的错误(Swift 5.2.4)是:
不能在属性初始值设定项内使用实例成员“metaHandler”;属性初始值设定项在“self”可用之前运行
这更有帮助,可以通过创建metaHandlerFunc lazy来解决
lazy var metaHandlerFunc: ((String, NSDictionary) -> NSNumber) = metaHandler或者,您可以将该函数设为静态的,如Martin的回答中所述。
https://stackoverflow.com/questions/62732772
复制相似问题