【问题标题】:Changing a JSContext-passed Swift object with JavaScriptCore使用 JavaScriptCore 更改 JSContext 传递的 Swift 对象
【发布时间】:2014-11-20 08:20:48
【问题描述】:

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

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

import Foundation
import JavaScriptCore

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

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

这是我创建 JSContext 的 AppDelegate,将我的自定义对象传递给它并运行 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 编译。

【问题讨论】:

    标签: macos swift osx-yosemite javascriptcore


    【解决方案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
    

    【讨论】:

    • 帮助。这在最新的 xcode 7.2 操场上不再正常工作了 :( 这将打印“ABC”而不是“XYZ”
    • 这似乎是游乐场的错误。仅当类和协议被标记为公共并移动到 Playground Sources 文件夹中的单独文件时,该示例也适用于 Playground。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-09-18
    • 1970-01-01
    • 1970-01-01
    • 2015-12-18
    • 1970-01-01
    • 2020-08-26
    相关资源
    最近更新 更多