Mükemmel şekilde yönetilebilir bir cevap buldum. Bunun ne kadar temiz olmasını istediğiniz, tamamen ne kadar iş yapmak istediğinize bağlıdır.
İlk olarak, C ++ sınıfınızı alın ve onunla arayüz oluşturmak için C "sarmalayıcı" işlevleri oluşturun. Örneğin, bu C ++ sınıfına sahipsek:
class MBR {
std::string filename;
public:
MBR (std::string filename);
const char *hexdump();
const char *imageType();
const char *bootCode();
const char *partitions();
private:
bool readFile(unsigned char *buffer, const unsigned int length);
};
Daha sonra şu C ++ işlevlerini uygularız:
#include "MBR.hpp"
using namespace std;
const void * initialize(char *filename)
{
MBR *mbr = new MBR(filename);
return (void *)mbr;
}
const char *hexdump(const void *object)
{
MBR *mbr;
static char retval[2048];
mbr = (MBR *)object;
strcpy(retval, mbr -> hexdump());
return retval;
}
const char *imageType(const void *object)
{
MBR *mbr;
static char retval[256];
mbr = (MBR *)object;
strcpy(retval, mbr -> imageType());
return retval;
}
Köprü başlığı daha sonra şunları içerir:
#ifndef ImageReader_hpp
#define ImageReader_hpp
#ifdef __cplusplus
extern "C" {
#endif
const void *initialize(char *filename);
const char *hexdump(const void *object);
const char *imageType(const void *object);
#ifdef __cplusplus
}
#endif
#endif
Swift'den artık nesneyi somutlaştırabilir ve onunla şu şekilde etkileşim kurabiliriz:
let cppObject = UnsafeMutablePointer<Void>(initialize(filename))
let type = String.fromCString(imageType(cppObject))
let dump = String.fromCString(hexdump(cppObject))
self.imageTypeLabel.stringValue = type!
self.dumpDisplay.stringValue = dump!
Gördüğünüz gibi, çözüm (aslında oldukça basit) bir nesneyi başlatacak ve o nesneye bir işaretçi döndürecek sarmalayıcılar yaratmaktır. Bu daha sonra, onu bu sınıfa uyan bir nesne olarak kolayca değerlendirebilen ve üye işlevlerini çağırabilen sarmalayıcı işlevlerine geri aktarılabilir.
Temizlemek
Bu harika bir başlangıç ve mevcut C ++ sınıflarını önemsiz bir köprü ile kullanmanın tamamen mümkün olduğunu kanıtlasa da, daha da temiz olabilir.
Bunu temizlemek, UnsafeMutablePointer<Void>Swift kodumuzun ortasından kaldırıp Swift sınıfına dahil etmemiz anlamına gelir . Esasen, aynı C / C ++ sarmalayıcı işlevlerini kullanıyoruz, ancak bunları bir Swift sınıfıyla arabirimlendiriyoruz. Swift sınıfı, nesne başvurusunu korur ve esasen tüm yöntem ve öznitelik başvuru çağrılarını köprü üzerinden C ++ nesnesine geçirir!
Bunu yaptıktan sonra, tüm köprüleme kodu tamamen Swift sınıfında özetlenmiştir. Hala bir C köprüsü kullanıyor olsak da, C ++ nesnelerini Objective-C veya Objective-C ++ 'da yeniden kodlamak zorunda kalmadan şeffaf bir şekilde kullanıyoruz.