我想在上下文中传递一个委托并试图做这样的事情:
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'
答案 0 :(得分:4)
这很聪明,但是你遇到了几个微妙的类型问题。像往常一样,最大的罪魁祸首是Any
和AnyObject
。你应该尽可能地避免这些。
你的第一个问题是:
[
"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)
}