2015-04-05 64 views
2

我想傳遞一個委託的背景下,並試圖做這樣的事情:如何傳遞一個函數作爲上下文參數?

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

這個錯誤來自pushContollerWithName線? – 2015-04-05 16:12:37

+0

是的,與「func」鍵一致。 – TruMan1 2015-04-05 16:13:20

+0

您可以發佈方法pushControllerWithName()的簽名嗎? – Abdullah 2015-04-05 16:14:43

回答

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) 
} 
+0

Thx對於這個建議,創建一個單獨的類最終變得更清潔。我帶來了太多的JavaScript包袱;) – TruMan1 2015-04-05 18:29:12

相關問題