无法使用 JavaScriptCore 中的 Swift 类

Posted

技术标签:

【中文标题】无法使用 JavaScriptCore 中的 Swift 类【英文标题】:Unable to use a Swift class from JavaScriptCore 【发布时间】:2015-07-24 17:43:19 【问题描述】:

我希望在 javascriptCore 上下文中实例化一个 Swift 类。

我在 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')')"

【问题讨论】:

我在命令行应用程序而不是 Playgroud 中尝试了相同的代码,它可以工作 ==> 可能是 Playground 错误/限制? 如果我将协议和类声明放在 PlayGround 的 Sources 文件夹中的单独文件中,它也可以工作,在“class Person”、“class func create”和“func sayHello”之前添加“public” ",并删除 "@objc (Person)" Tnx,节省了我的时间。正如你提到的,这只是一个游乐场错误。 【参考方案1】:

这适用于 XCode 8.2.1 和 swift3(我敢打赌这与 Swift 3 中的新方法名称/标签管理有关):

context.evaluateScript("Person.createWithName('Mike')")

【讨论】:

以上是关于无法使用 JavaScriptCore 中的 Swift 类的主要内容,如果未能解决你的问题,请参考以下文章

Swift Playgrounds 中的 JavaScriptCore

如何使用 JavaScriptCore 将错误记录到 XCode?

使用 Swift iOS 中的 Javascriptcore 框架将 NSobject 传递给 javascript

如何使用 JavaScriptCore 从 Swift 中的 javascript SDK 调用异步 javascript 函数

无法在 JavaScriptCore JSContext 中运行 proj4.js

iOS9 上的 JavaScriptCore 崩溃