如何将函数作为上下文参数传递?

时间:2015-04-05 16:00:30

标签: ios swift

我想在上下文中传递一个委托并试图做这样的事情:

    func process(value: Float) -> Float {
        return value * 999.9
    }
-----------
    self.pushControllerWithName("someController", context: [
        "func": SomeUtils.process,
        "someValue": 1
    ])

someController中,我试图在init中执行类似的操作:

var contextFunc = context as func
contextFunc(123)

这不会产生错误:'AnyObject?' does not have a member named 'Key'

1 个答案:

答案 0 :(得分:4)

这很聪明,但是你遇到了几个微妙的类型问题。像往常一样,最大的罪魁祸首是AnyAnyObject。你应该尽可能地避免这些。

你的第一个问题是:

[
    "func": SomeUtils.process,
    "someValue": 1
]

定义[String: Any],无法转换为AnyObject。您无法将Any(例如Float -> Float)与NSDictionary联系起来。您需要AnyObject

您的第二个问题是您使用contextFunc与您传递的数据不一致。 context不是Float->Float。它是[String:Any]。这可能只是你问这个问题的错误。

那么如何解决呢?你需要一个AnyObject。什么是最简单的AnyObject?当然是一个目标:

class Context {
    let f: Float -> Float
    let value: Int
    init(f: Float -> Float, value: Int) {
        self.f = f
        self.value = value
    }
}

现在你可以传递其中一个:

self.pushControllerWithName("someController", 
    context: Context(f: SomeUtils.process, value: 1))

你可以像这样卸载它:

if let context = context as? Context {
    let contextFunc = context.f
    let result = contextFunc(123)
}