Skip to content

[BridgeJS][ExportSwift] Support @JS protocol to import abstract JS interface #440

@kateinoigakukun

Description

@kateinoigakukun

Input

@JS protocol MyViewControllerDelegate {
    func onSomethingHappened()
}

@JS class MyViewController {
    var delegate: MyViewControllerDelegate
    init(delegate: MyViewControllerDelegate) { self.delegate = delegate }

    func onSomethingHappened() {
        delegate.onSomethingHappened()
    }
}

Output

export interface MyViewControllerDelegate {
    onSomethingHappened(): void;
}

type Exports = {
    MyViewController: {
        new(delegate: MyViewControllerDelegate)
    }
}
struct AnyMyViewControllerDelegate: MyViewControllerDelegate {
    let jsObject: JSObject
    func onSomethingHappened() { 
        @_extern(wasm, "MyApp", "MyViewControllerDelegate_onSomethingHappened")
        func onSomethingHappened(this: Int32)
        onSomethingHappened(this: jsObject.id)
    }

    func bridgeJSLiftParameter(_ value: Int32) -> Self {
        return AnyMyViewControllerDelegate(jsObject: JSObject(id: value))
    }
}

@_expose(wasm, "MyViewController_init")
func MyViewController_init(delegate: Int32) -> Int32 {
    return MyViewController(delegate: AnyMyViewControllerDelegate.bridgeJSLiftParameter()).bridgeJSLowerResult()
}

Usage

const { exports } = await init();
const vc = new exports.MyViewController({
    onSomethingHappened: () => { ... }
})

Metadata

Metadata

Assignees

Labels

No labels
No labels

Type

No type

Projects

No projects

Milestone

No milestone

Relationships

None yet

Development

No branches or pull requests

Issue actions