首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >将Swift函数赋值给函数变量时出现问题

将Swift函数赋值给函数变量时出现问题
EN

Stack Overflow用户
提问于 2020-07-05 02:14:02
回答 2查看 37关注 0票数 1

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

代码语言:javascript
复制
class Test: NSObject {
    func metaHandler(name elementName: String, attributes attr : NSDictionary) -> NSNumber
    {
        return NSNumber.init()
    }
    var metaHandlerFunc: ((String, NSDictionary) -> NSNumber) = metaHandler
}

当我将函数赋给var时,我得到了一个编译器错误:

代码语言:javascript
复制
Cannot convert value of type '(Test) -> (String, NSDictionary) -> NSNumber' to specified type '(String, NSDictionary) -> NSNumber'

我的例子似乎与我在其他地方看到的完全一样。有什么建议吗?

我正在运行Xcode10.3。

EN

回答 2

Stack Overflow用户

发布于 2020-07-05 02:20:26

您已经将metaHandler定义为实例方法,即应用于Test的具体实例的方法。因此,它具有以下签名

代码语言:javascript
复制
(Test) -> (String, NSDictionary) -> NSNumber

有关示例Instance Methods are “Curried” Functions in Swift,请参阅。

将其定义为“类型方法”(使用classstatic)可以解决这个问题:

代码语言:javascript
复制
static func metaHandler(...)

现在它有了签名(String, NSDictionary) -> NSNumber,可以分配给var metaHandlerFunc了。

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

票数 1
EN

Stack Overflow用户

发布于 2020-07-05 02:49:57

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

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

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

这更有帮助,可以通过创建metaHandlerFunc lazy来解决

代码语言:javascript
复制
lazy var metaHandlerFunc: ((String, NSDictionary) -> NSNumber) = metaHandler

或者,您可以将该函数设为静态的,如Martin的回答中所述。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/62732772

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档