मैंने पूरी तरह से प्रबंधनीय जवाब दिया है। आप कितना साफ होना चाहते हैं यह पूरी तरह से इस बात पर आधारित है कि आप कितना काम करने को तैयार हैं।
सबसे पहले, अपने C ++ क्लास को लें और इसके साथ इंटरफेस करने के लिए C "आवरण" फ़ंक्शन बनाएं। उदाहरण के लिए, यदि हमारे पास यह C ++ वर्ग है:
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);
};
हम फिर इन सी ++ कार्यों को लागू करते हैं:
#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;
}
पुल हैडर में तब शामिल होता है:
#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
स्विफ्ट से, अब हम ऑब्जेक्ट को इंस्टेंट कर सकते हैं और इसके साथ इंटरैक्ट कर सकते हैं:
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!
इसलिए, जैसा कि आप देख सकते हैं, समाधान (जो वास्तव में सरल है) ऐसे रैपर बनाने के लिए है जो किसी वस्तु को तुरंत बदल देगा और उस वस्तु को एक पॉइंटर लौटाएगा। फिर इसे रैपर फ़ंक्शंस में वापस भेजा जा सकता है जो आसानी से उस क्लास के अनुरूप ऑब्जेक्ट के रूप में व्यवहार कर सकते हैं और सदस्य फ़ंक्शन को कॉल कर सकते हैं।
इसे क्लीनर बनाना
हालांकि यह एक शानदार शुरुआत है और यह साबित करता है कि एक तुच्छ पुल के साथ मौजूदा सी ++ कक्षाओं का उपयोग करना पूरी तरह से संभव है, यह क्लीनर भी हो सकता है।
इसे साफ करने का सीधा मतलब यह होगा कि हम UnsafeMutablePointer<Void>
अपने स्विफ्ट कोड के बीच से हटाकर स्विफ्ट क्लास में इनकैप्सुलेट कर दें। अनिवार्य रूप से, हम समान C / C ++ रैपर फ़ंक्शन का उपयोग करते हैं लेकिन उन्हें स्विफ्ट क्लास के साथ इंटरफ़ेस करते हैं। स्विफ्ट वर्ग वस्तु संदर्भ को बनाए रखता है और अनिवार्य रूप से सभी विधि और विशेषता संदर्भ कॉल को पुल के माध्यम से C ++ ऑब्जेक्ट पर भेजता है!
ऐसा करने के बाद, स्विफ्ट क्लास में सभी ब्रिजिंग कोड पूरी तरह से समाप्त हो जाते हैं। भले ही हम अभी भी एक सी ब्रिज का उपयोग कर रहे हैं, हम उद्देश्यपूर्ण-सी या ऑब्जेक्टिव-सी ++ में उन्हें रीकोड करने के लिए बिना सी ++ ऑब्जेक्ट्स का पारदर्शी रूप से उपयोग कर रहे हैं।