我目前正在用 Swift 编写一个与比特币相关的应用程序。由于没有可用的 BIP32/39 原生库,我决定使用 JavaScriptCore 来使用 js 库。
问题是,Swift 中几乎所有内容都会输出 undefined
,例如:
var pip_buffer = new Uint8Array(strength / 8);
这个有效:
var pip_buffer = "Hello, world"
这是我的 Swift 代码:
var context: JSContext?
private func initJS() {
context = JSContext()
if let jsSrcPath = Bundle.main.path(forResource: "script", ofType: "js") {
do {
let jsSrcContents = try String(contentsOfFile: jsSrcPath)
_ = context?.evaluateScript(jsSrcContents)
} catch let error {
print(error.localizedDescription)
}
}
}
private func getJSVar(name: String) {
if let vb = context?.objectForKeyedSubscript(name) {
print("\(vb)")
}
}
override func viewDidLoad() {
super.viewDidLoad()
initJS()
getJSVar(name: "pip_buffer")
}
如何让这个东西发挥作用?
最佳答案
查看JSValue API Doc我没有看到任何对 Uint8Array
的引用,这可能意味着 JavaScriptCore 无法将 Uint8Array
转换为“Swift”值。
您可以在 JS 端使用 Array.from(pip_buffer)
将您的 Uint8Array
转换为常规数字数组,这是可行的。
例如
if let vb = context?.evaluateScript("Array.from(pip_buffer)") {
print("\(vb)")
}
一旦转换为常规 JS 数字数组,您还可以使用 JSValue.toArray()
(Swift 端),将其作为数组获取(也可以使用 toNumber()
、toInt32()
或 toUInt32()
,对于数组中的每个项目)。
关于ios - JavaScriptCore 除了 'hello, world' 之外不工作,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42562501/