将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:你是对的,这也可以解决编译器错误(请随意发布答案)。