将Swift函数指定给函数变量时出现问题

将Swift函数指定给函数变量时出现问题,swift,function,variables,Swift,Function,Variables,以下是我的问题的一个简单例子: class Test: NSObject { func metaHandler(name elementName: String, attributes attr : NSDictionary) -> NSNumber { return NSNumber.init() } var metaHandlerFunc: ((String, NSDictionary) -> NSNumber) = metaHan

以下是我的问题的一个简单例子:

class Test: NSObject {
    func metaHandler(name elementName: String, attributes attr : NSDictionary) -> NSNumber
    {
        return NSNumber.init()
    }
    var metaHandlerFunc: ((String, NSDictionary) -> NSNumber) = metaHandler
}
当我将函数分配给变量时,出现编译器错误:

Cannot convert value of type '(Test) -> (String, NSDictionary) -> NSNumber' to specified type '(String, NSDictionary) -> NSNumber'
我的例子似乎正是我在别处看到的例子。有什么建议吗


我正在运行Xcode 10.3。

您已经将
元处理程序定义为一种实例方法,即应用于
测试的具体实例的方法。因此,它有签名

(Test) -> (String, NSDictionary) -> NSNumber
例如,见

将其定义为“类型方法”(使用
静态
)可以解决以下问题:

static func metaHandler(...)
现在它具有签名
(字符串,NSDictionary)->NSNumber
,并且可以分配给
var metaHandlerFunc


如果应该允许重写子类中的方法,请选择
class func

问题是您试图将实例函数赋值给实例变量,这意味着应该在赋值之前初始化实例

顺便说一句,我得到的错误(Swift 5.2.4)是:

无法在属性初始值设定项中使用实例成员“metaHandler”;属性初始值设定项在“self”可用之前运行

这更有帮助,可以通过使
metaHandlerFunc
懒惰来解决:

lazy var metaHandlerFunc: ((String, NSDictionary) -> NSNumber) = metaHandler

或者,您可以按照Martin的回答将函数设置为静态。

虽然这是事实,但报告的问题(至少在我运行提供的示例时)是“属性初始值设定项在“self”可用之前运行”。因此,一个
惰性var
似乎可以解决这个问题。我遗漏了什么吗?@Alladinian:你是对的,这也可以解决编译器错误(请随意发布答案)。