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