Avatar
Avatar
omochimetaru
@Yuta Saito JavaScriptKitのJSClosure型なんですけど、 is JSObjectだけど、is JSFunctionではないのが変な感じがします 1. 「呼び出せる型で共通化して受け取って呼び出す」コードが書けない 2. JSClosure.jsValueをJSObject.constructに渡すとJSObject型になり、JSFunction.constructに渡すと失敗する 3. JSClosureを一度JSに渡してから取り出して作ったJSValueではJSFunctionになっている。これは2と矛盾する。 まだ実行してないけどこうなってるようにみえる (edited)
omochimetaru 4/7/2024 1:58 AM
自動テストで確認した。 final class JavaScriptKitTests: XCTestCase { func testClosureAsFunction() throws { let clo = JSClosure { (_) in return 7.jsValue } let obj = try JSObject.mustConstruct(from: clo.jsValue) XCTAssertFalse(obj is JSFunction) let fn = clo.asFunction() let ret = try Int.mustConstruct(from: try fn()) XCTAssertEqual(ret, 7) } } extension JSClosure { #if USES_JAVASCRIPT_KIT_MOCK public func asFunction() -> JSThrowingFunction { let fn = native as! JSNativeFunction return JSFunction(native: fn).throws } #else public func asFunction() -> JSThrowingFunction { var buffer: JSValue = Array<Int>([0]).jsValue buffer[0] = self.jsValue let fn = JSFunction.unsafeConstruct(from: buffer[0]) return fn.throws } #endif }