2015-09-12 11 views
22

Mi piacerebbe poter usare gli oggetti Ruggine in Swift, in qualche modo informare Swift quando gli oggetti di Rust cambiano/accadono gli eventi, e sfruttare l'ARC di Swift per mantenere in vita gli oggetti di Ruggine.Qual è il modo migliore per utilizzare una libreria Rust nel codice Swift?

Finora ciò che mi viene in mente è quello di scrivere un API pianura C per gli oggetti Rust, poi scrivere un involucro Objective-C per l'API C, e quindi esportare che a Swift, in questo modo:

adapting adapters

C'è un modo meno noioso? Qualcosa che può generare automaticamente funzioni wrapper e file header C?

+4

Probabilmente non in un modo immediato. Le filosofie di gestione della memoria di Rust e Swift sono molto diverse. –

+0

Considerati gli strati di riferimento indiretto che hai disposto (Rust -> C -> ObjC -> Swift), la tua scommessa migliore sarà probabilmente il vecchio RPC noioso. – LinearZoetrope

risposta

4

Sto lavorando a un progetto simile a questo ora (il porting di una libreria C++ funziona sia su iOS che su Android).

L'unico modo corretto per farlo è quello di extern "C" le interfacce Rust e scrivere un semplice file .h per esso, e creare un semplice wrapping di classe ObjC per quelli. Quindi si inserisce lo #import <someframework/someframework.h> nell'intestazione Objective C to Swift e tutto funziona correttamente.

È un po 'noioso, ma in realtà non è tanto lavoro nella pratica. Diventa doloroso solo se cerchi di trasferire oggetti complessi oltre i limiti, il che si traduce nella scrittura di un mucchio di strutture, e poi tutto va in discesa. Ti consiglio di non farlo, atteniti ai primitivi e agli array.

Se il tuo modello è più complesso di quello, considera qualcosa come IPC come altri hanno detto, anche se potrebbe essere molto più doloroso nella pratica.

Quindi sì, noioso. La buona notizia però è che in realtà funziona, comunque. :)