Невозможно использовать класс Swift из JavaScriptCore
Я пытаюсь создать экземпляр класса Swift в контексте JavaScriptCore.
Я пробовал разные синтаксисы с Playground, также пробовал на Xcode 6.4 (Swift 1.2) и Xcode 7 beta 3 (Swift 2.0), но безуспешно =-(
Может быть, я что-то упустил.
В более сложном примере, который я обнаружил в сети, функция протокола 'create' была определена как 'class func', но компилятор отказывается от этого синтаксиса, говоря: "Методы класса разрешены только внутри классов; используйте static для объявления статического метода. "... так я и сделал.
Вот мой код (OS X 10.10.4 - Xcode 6.4). Я использую игровую площадку:
//: Playground - noun: a place where people can play
import Foundation
import JavaScriptCore
let context = JSContext()
// errors handling
context.exceptionHandler = { context, exception in
println("JS Error: \(exception)")
}
@objc
protocol PersonJavaScritMethod : JSExport {
func sayHello()
static func create(name : String) -> Person
}
class Person : NSObject, PersonJavaScritMethod {
var name : String!
init(name:String) {
super.init()
println("# init done #")
self.name = name
}
class func create(name : String) -> Person {
return Person(name: name)
}
func sayHello() {
println("Hello \(name)")
}
}
let aPerson = Person.create("Toto")
// -> ok : console output : "# init done #"
aPerson.sayHello()
// -> ok : console output : "Hello Toto"
context.globalObject.setObject(Person.self, forKeyedSubscript: "Person")
context.evaluateScript("Person.create('Mike')")
// -> not ok : console output :
// "JS Error: TypeError: undefined is not a function (evaluating 'Person.create('Mike')')"
1 ответ
Это работает с XCode 8.2.1 и swift3 (держу пари, это связано с новым управлением именами методов / метками в Swift 3):
context.evaluateScript("Person.createWithName('Mike')")