2015-04-05 3 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 ? –

+0

Да, с линией с клавишей «func». – TruMan1

+0

Не могли бы вы разместить подпись метода pushControllerWithName()? – Abdullah

ответ

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

Thx за предложение, создав отдельный класс, оказался намного чище. Я привел слишком много багажа JavaScript;) – TruMan1

Смежные вопросы