我正在尝试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文档指出,“ ...如果无法将值转换为预期的类,则为零。”我追求为什么。
最佳答案
为什么ofObjectToClass
返回nil
而不是我的Pet
类的实例?
因为您的JavaScript类Pet
与您的Swift类Pet
没有任何关系。
您需要显式导出Swift类Pet
:
import JavaScriptCore
let javascript = """
var fetchPet = function(name) {
return new Pet(name);
};
"""
@objc protocol PetProtocol: JSExport {
var name: String {get set}
init(name: String)
}
class Pet: NSObject, PetProtocol {
var name: String
required init(name: String) {
self.name = name
}
}
let context = JSContext()!
context.setObject(Pet.self, forKeyedSubscript: "Pet" as NSString) //<-
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 :(")
}