JSValue.toObjectOf返回nil

时间:2019-05-18 00:52:52

标签: ios swift javascriptcore

我正在尝试JavaScriptCore和JSValue.toObjectOfClass。我的问题是,鉴于以下代码,为什么ofObjectToClass返回nil而不是我的Pet类的实例?

注意:这是一个精简的示例,它模拟了我试图使用更大的代码库进行的操作。请原谅它的简单性质,并随时了解ofObjectToClass的内部工作原理。似乎很少有关于它的信息。

这是我正在使用的代码-您可以将其直接放到Swift Playground中并自己尝试:

import JavaScriptCore

let javascript = """
var Pet = (function() {
    function Pet(name) {
        this._name = name;
    }

    Object.defineProperty(Pet.prototype, 'name', {
        get: function () {return this._name;},
        set: function (name) {this._name = name;}
    });

    return Pet;
})();

var fetchPet = function(name) {
    return new Pet(name);
}
"""

@objc public class Pet: NSObject, JSExport {
    public var name: String?
}

let context = JSContext()!
context.evaluateScript(javascript)
let fcn = context.objectForKeyedSubscript("fetchPet")!
let petValue = fcn.call(withArguments: ["Fido"])
print("petValue.name is \(petValue?.forProperty("name")?.toString() ?? "???")")
if let petObj = petValue?.toObjectOf(Pet.self) as? Pet {
    print("pet.name is \(petObj.name)")
}
else {
    print("pet is nil :(")
}

这是我得到的输出:

petValue.name is Fido
pet is nil :(

以及我期望的输出:

petValue.name is Fido
pet.name is Fido

感谢您的光临,祝您周末愉快!

编辑:我知道Apple文档指出:“ ...如果无法将值转换为预期的类,则为零。我追求为什么

1 个答案:

答案 0 :(得分:0)

为什么> a = -1.28799 > L = -43.95321 > (1 - 0.25^(1/a))*L [1] 84.99999 > (1 - 0.75^(1/a))*L [1] 11.00005 返回ofObjectToClass而不是我的nil类的实例?

因为您的JavaScript类Pet与您的Swift类Pet无关。

您需要显式导出Swift类Pet

Pet