2017-03-02 2 views
0

J'écris actuellement une application liée à Bitcoin dans Swift. Comme il n'y a pas de bibliothèques natives pour BIP32/39 disponibles, j'ai décidé d'aller avec celles de JavaScript en utilisant JavaScriptCore.JavaScriptCore ne fonctionne pas autre chose que 'bonjour, monde'

Le problème est, presque tout les sorties undefined à Swift, par exemple:

var pip_buffer = new Uint8Array(strength/8); 

Celui-ci fonctionne:

var pip_buffer = "Hello, world" 

Voici mon code 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") 
} 

Comment faire cette chose fonctionne?

Répondre

0

regardant JSValue API Doc Je ne vois aucune référence à Uint8Array, ce qui signifie probablement que JavaScriptCore ne peut pas convertir Uint8Array à une valeur « Swift ».

Vous pouvez utiliser Array.from(pip_buffer) du côté JS pour convertir votre Uint8Array en un tableau de nombre normal, ce qui fonctionne.

par exemple.

if let vb = context?.evaluateScript("Array.from(pip_buffer)") { 
     print("\(vb)") 
    } 

Une fois converti un tableau de nombre JS régulier, vous pouvez également utiliser JSValue.toArray() (côté Swift), pour l'obtenir comme un tableau (et peut également utiliser toNumber(), toInt32() ou toUInt32(), pour chaque élément du tableau).