JavaScriptCore 除了 'hello, world' 以外没有任何作用
JavaScriptCore doesn't work anything else than 'hello, world'
我目前正在 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()
,对于数组中的每一项)。
我目前正在 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()
,对于数组中的每一项)。