Ich habe versucht, herauszufinden, wie JavaScriptCore in swift verwenden. Ich stoße auf Probleme, aber wenn ich mit Blöcken als Argumente umgehen muss, scheint der Block sofort ausgeführt zu werden und die Argumente erhalten den Rückgabewert des Blocks. Was mache ich falsch?Schnelle Blöcke funktionieren nicht
Arbeiten Objective-C-Code:
JSContext* context = [[JSContext alloc] initWithVirtualMachine:[[JSVirtualMachine alloc] init]];
context[@"test"] = ^(NSString *string) {
//code
};
Was ich versucht habe:
1:
var ctx = JSContext(virtualMachine:JSVirtualMachine())
var ctx["test"] = {(string:NSString)->() in /*code*/ }
//Gives me "'JSContext' does not have a member named 'subscript'"
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 [email protected] protocol type 'AnyObject'"
Fehle ich hier etwas, oder ist das nur ein Fehler in Swift?
Edit:
Ich habe jetzt auch versucht, Vorschläge von Cast closures/blocks
class Block<T> {
let f : T
init (_ f: T) { self.f = f }
}
und dann
ctx.setObject(Block<()->Void> {
/*code*/
}, forKeyedSubscript: "test")
Diese Lösung lässt mich zusammenstellen, aber ich erhalte einen Laufzeitfehler:
Thread 1: EXC_BREAKPOINT (code=EXC_I386_BPT, subcode=0x0)
Scheint das gleiche Problem wie dieses: http://stackoverflow.com/questions/24586293/cast-closures-blocks. –
Es ist ähnlich, aber anders. Bei dieser Frage geht es um Blöcke, die Sie als Rückgabewerte * von * Objc-Methoden erhalten. Hier geht es darum, Swift-Verschlüsse als Blöcke * zu * Objc-Methoden zu übergeben. –