2014-11-20 1 views
0

JavaScriptCore로 전달 된 객체를 변경하는 중에 문제가 있습니다. 여기 JavaScriptCore로 JSContext 전달 Swift 객체 변경하기

이 testProperty라는 단일 문자열 속성 정의 내 사용자 지정 개체입니다 :

여기
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가 변경되지 않아야합니까?

Btw, OS X 10.10.1의 XCode 6.1.1에서 컴파일 된 OS X 앱입니다.

답변

1

프로토콜이 @objc으로 표시되고 클래스에 명시 적으로 @objc 내보내기 이름이 필요합니다.

내가 운동장에서 다음 스크립트를 시도하고

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 
+0

당신이 린타로 감사 작동,이 문제는 해결! – Rhuantavan

+0

Help. 최신 xcode 7.2 놀이터에서 더 이상 제대로 작동하지 않습니다. ("XYZ"대신 "ABC"가 인쇄됩니다. – Prcela

+0

놀이터 버그로 보입니다. 클래스 및 프로토콜이 공개로 표시된 경우에만 샘플이 놀이터에서 잘 작동합니다. 놀이터 소스 폴더에서 별도의 파일로 이동했습니다. – Prcela