首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >JavascriptCore不从clases导出方法

JavascriptCore不从clases导出方法
EN

Stack Overflow用户
提问于 2015-04-12 22:06:19
回答 2查看 617关注 0票数 1

我试图从一个快速类的单例实例中调用一个方法。

这是我的协议:

代码语言:javascript
复制
@objc public protocol MyProtocol: JSExport {

    var name: String { get set }

    func sum(a:Int, b: Int) -> Int
}

这是我的班级:

代码语言:javascript
复制
private let sharedInstance = MySingleton()

@objc public class MySingleton: NSObject, MyProtocol {

    // Singleton
    public class var sharedApp : MySingleton {

        return sharedInstance
    }    

    public var username: String

    override private init() {

        self.username = "Oscar"

        super.init()
    }

    public func sum(a: Int, b: Int) -> Int {

        return a + b
    }
}

我做了一些测试。当我访问一个属性时,它会传递:

代码语言:javascript
复制
func testName() {

    var virtualMachine = JSVirtualMachine()
    js = JSContext(virtualMachine: virtualMachine)

    var singleton: MySingleton = MySingleton.sharedApp

    self.context.setObject(
        singleton.self,
        forKeyedSubscript: "Singleton")

    let name = js.evaluateScript("Singleton.username").toString()

    XCTAssertTrue(name == "Oscar", "Name is not Colossal, was " + name); // PASS!!!!!
}

但是,当我调用一个方法时,它会失败:

代码语言:javascript
复制
func testSum() {

    var virtualMachine = JSVirtualMachine()
    js = JSContext(virtualMachine: virtualMachine)

    var singleton: MySingleton = MySingleton.sharedApp

    self.context.setObject(
        singleton.self,
        forKeyedSubscript: "Singleton")

    let name = js.evaluateScript("Singleton.sum(3, 2);").toInt32()

    XCTAssertTrue(sum == 5, "Sum was " + String(sum)); // Fails. Says sum was 0
}

它只在从Javascript对象/向Javascript对象读取/写入属性时起作用,而不是在调用方法时.

我做错了什么?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2015-04-13 11:44:36

我刚找到了解决办法。尝尝这个。

代码语言:javascript
复制
func sum(a:Int, _ /* <-- make this argument unnamed */ b: Int) -> Int

JSExport似乎还不支持命名参数。

票数 2
EN

Stack Overflow用户

发布于 2015-08-19 22:04:52

JSExport支持命名参数,只需将它们添加到函数名中,例如:

swift功能:

代码语言:javascript
复制
func myFunction(param1 : String, param2 : String, param3 : String)

必须从javascript调用:

代码语言:javascript
复制
myFunctionParam2Param3( "a", "b", "c")

在您的示例中,只需调用sumB()而不是sum():

代码语言:javascript
复制
let name = js.evaluateScript("Singleton.sumB(3, 2);").toInt32()
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/29595190

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档