I was trying to figure out how to use JavaScriptCore in swift. I run into problems, however, when I have to deal with blocks as arguments, it looks like the block starts immediately and the arguments get the return value of the block. What am I doing wrong?
Work Code Goal C:
JSContext* context = [[JSContext alloc] initWithVirtualMachine:[[JSVirtualMachine alloc] init]]; context[@"test"] = ^(NSString *string) {
What I tried:
one
var ctx = JSContext(virtualMachine:JSVirtualMachine()) var ctx["test"] = {(string:NSString)->() in }
2:
var ctx = JSContext(virtualMachine:JSVirtualMachine()) let n: (string: String)->() = {string in /*code*/} ctx.setObject(n, forKeyedSubscript:"test") //Gives me "Type '(x: String) -> () does not conform to protocol 'AnyObject'"
3:
var ctx = JSContext(virtualMachine:JSVirtualMachine()) let n: (string: String)->() = {string in /*code*/} ctx.setObject(n as AnyObject, forKeyedSubscript:"test") //Gives me "Cannot downcast from '(string: String) -> () to non-@objc protocol type 'AnyObject'"
Am I missing something, or is this just a bug in Swift?
Edit:
Now I also tried offers from Closing / blocking clips
class Block<T> { let f : T init (_ f: T) { self.f = f } }
and then
ctx.setObject(Block<()->Void> { }, forKeyedSubscript: "test")
This solution allows me to compile, but I get a runtime error:
Thread 1: EXC_BREAKPOINT (code=EXC_I386_BPT, subcode=0x0)
block swift javascriptcore
hannesr
source share