我在更改传递给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中编译。
答案 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