簡體   English   中英

如何從Swift調用JavaScript

[英]How to call javascript from swift

我想用一些用戶定義的宏擴展電子表格應用程序。 使用javascript似乎是一個好主意...

它發現了一個“小問題”(我完全不熟悉javascript)

import JavaScriptCore

let context = JSContext()!
context.exceptionHandler = { context, exception in
    print("exception:", exception?.toString() ?? "")
}

context.evaluateScript(
    """
    foo = function(a, b) {
        return a + b
    }
    """
)
context.evaluateScript("foo(1, 2)") // 3
context.objectForKeyedSubscript("foo")?.call(withArguments: [1,2]) // 3

context.evaluateScript(
    """
    Foo = function() {}
    Foo.foo = function(a, b) {
        return a + b
    }
    """
)
context.evaluateScript("Foo.foo(1, 2)") // 3

// exception.  TypeError: undefined is not an object
context.objectForKeyedSubscript("Foo.foo")?.call(withArguments: [1, 2]) // Foo.foo is undefined ?????

如果Foo.foo是未定義的,它怎么能只運行一行呢?

終於我找到了解決方案...

context.objectForKeyedSubscript("Foo")?.objectForKeyedSubscript("foo")?.call(withArguments: [1, 2]) // 3

或更好 ...

extension JSContext {
    func objectForKeySubscript(_ dotted: String) -> JSValue! {
        var iterator = dotted.split(separator: ".").makeIterator()
        var jsValue = self.objectForKeyedSubscript(iterator.next())
        while let str = iterator.next() {
            jsValue = jsValue?.objectForKeyedSubscript(str)
        }
        return jsValue
    }
}
context.objectForKeySubscript("Foo.foo")?.call(withArguments: [1, 2])

最后我發現

context.evaluateScript("Foo.foo")?.call(withArguments: [1, 2])

可以正常工作... :-)

您嘗試了.call(withArguments ,但是我認為這可以與Function.prototype.call() ,該Function.prototype.call()需要兩個參數(對象和參數)。有關更多信息: https : //developer.mozilla.org/en-US/docs/網絡/ JavaScript的/參考/ Global_Objects /功能/通話

這有效

context.objectForKeyedSubscript("Foo")?.invokeMethod("foo", withArguments: [1, 2])

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM