gpt4 book ai didi

ios - JSValue.toObjectOf 返回 nil

转载 作者:行者123 更新时间:2023-11-29 05:45:22 25 4
gpt4 key购买 nike

我正在尝试使用 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 文档指出,“...如果该值无法转换为预期的类,则为 nil”。我正在寻找原因

最佳答案

为什么是 ofObjectToClass返回nil而不是我的 Pet 的实例类(class)?

因为你的 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 :(")
}

关于ios - JSValue.toObjectOf 返回 nil,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56195117/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com