使用JavaScriptCore更改JSContext传递的Swift对象

时间:2014-11-20 08:20:48

标签: macos swift osx-yosemite javascriptcore

我在更改传递给JavaScriptCore的对象时遇到问题。

这是我的自定义对象,定义了一个名为testProperty的String属性:

import Foundation
import JavaScriptCore

protocol JSCustomObjectExport: JSExport {
    var testProperty: String { get set }
}

class JSCustomObject: NSObject, JSCustomObjectExport {
    var testProperty: String = "ABC"
}

这是AppDelegate,我在其中创建一个JSContext,将我的自定义对象传递给它并运行一个JS脚本来改变它的testProperty来自" ABC"至" XYZ"。但是testProperty永远不会改变。

import Cocoa
import JavaScriptCore

class AppDelegate: NSObject, NSApplicationDelegate {

    @IBOutlet var window: NSWindow!
    lazy var context = JSContext()

    func applicationDidFinishLaunching(aNotification: NSNotification?) {
        println("Started")
        var co = JSCustomObject()
        context.globalObject.setValue(co, forProperty: "customObject")
        context.evaluateScript("customObject.testProperty = 'XYZ'")
        println(co.testProperty) // ERROR(?): This prints "ABC" instead of "XYZ"
    }

}

我做错了吗?不应该改变co.testProperty吗?

顺便说一句,这是一个OS X应用程序,在OSX 10.10.1上的XCode 6.1.1中编译。

1 个答案:

答案 0 :(得分:1)

看来,它要求协议标记为@objc,并且该类具有明确的@objc导出名称。

我在Playground中尝试了以下脚本,它可以正常工作

import Foundation
import JavaScriptCore

@objc // <- HERE
protocol JSCustomObjectExport: JSExport {
    var testProperty: String { get set }
}

@objc(JSCustomObject) // <- HERE
class JSCustomObject: NSObject, JSCustomObjectExport {
    var testProperty: String = "ABC"
}

var context = JSContext()
var co = JSCustomObject()
context.globalObject.setValue(co, forProperty: "customObject")
context.evaluateScript("customObject.testProperty = 'XYZ'")
println(co.testProperty) // -> XYZ