Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/ios/111.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
JavascriptCore:从本机代码执行javascript定义的回调函数_Javascript_Ios_Swift_Cocoa_Javascriptcore - Fatal编程技术网

JavascriptCore:从本机代码执行javascript定义的回调函数

JavascriptCore:从本机代码执行javascript定义的回调函数,javascript,ios,swift,cocoa,javascriptcore,Javascript,Ios,Swift,Cocoa,Javascriptcore,我在尝试从本机代码执行javascript函数时遇到了一些困难。我希望脚本编写者能够用Javascript定义“配方”。它是通过调用我从本机代码中公开的配方创建函数创建的。recipe函数接受一个config dict,它需要一个配方名称和一个操作。该操作应该是一个无参数、无返回值的函数 回到本机代码中,当我处理config dict时,我似乎无法获得定义的action函数的引用。我实际上得到的是一本没有钥匙的字典 谢谢你的帮助 Javascript // topLevel is a valid

我在尝试从本机代码执行javascript函数时遇到了一些困难。我希望脚本编写者能够用Javascript定义“配方”。它是通过调用我从本机代码中公开的配方创建函数创建的。recipe函数接受一个config dict,它需要一个配方名称和一个操作。该操作应该是一个无参数、无返回值的函数

回到本机代码中,当我处理config dict时,我似乎无法获得定义的action函数的引用。我实际上得到的是一本没有钥匙的字典

谢谢你的帮助

Javascript

// topLevel is a valid object I expose. It has a module 
// function that returns a new module 
var module = topLevel.module("Demo - Recipe");

// module has a recipe method that takes a config dict
// and returns a new recipe
module.recipe({
 name: "Recipe 1",
 action: function() {
   topLevel.debug("Hello from Recipe 1!");
 }
});
本机代码:

@objc public protocol ModuleScriptPluginExports: JSExport {
    func recipe(unsafeParameters: AnyObject) -> ModuleScriptPlugin
}

...

public func recipe(unsafeParameters: AnyObject) -> ModuleScriptPlugin {
   guard let parameters : [String:AnyObject] = unsafeParameters as? [String: AnyObject] else {
       // error, parameters was not the config dict we expected...
       return self;
   }

   guard let name = parameters["name"] as? String else {
       // error, there was no name string in the config dict
       return self;
   }

   guard let action = parameters["action"] as? () -> Void else {
       // error, action in the config dict was not a () -> Void callback like I expected
       // what was it...?
       if let unknownAction = parameters["action"] {
           // weird, its actually a NSDictionary with no keys!
           print("recipe action type unknown. action:\(unknownAction) --> \(unknownAction.dynamicType) ");
       }
       ...
   }

好的,我把它整理好了。发布此消息以防其他人遇到此消息

问题在于Swift代码中JSValue被强制到字典中:

parameters : [String:AnyObject] = unsafeParameters as? [String: AnyObject]
它使用toDictionary(),这样做似乎会丢弃函数属性

相反,JSValue应该保持不变,然后使用valueForProperty来获取函数,该函数本身就是JSValue

let actionValue = parameters.valueForProperty("action");
actionValue.callWithArguments(nil);