जवाबों:
नहीं। जब आप .m से स्विच करते हैं। आप वास्तव में ऑब्जेक्टिव-सी से एक अलग भाषा (जिसमें कई सूक्ष्म अंतर होते हैं) पर स्विच कर रहे हैं, जिसे ऑब्जेक्टिव-सी ++ कहा जाता है। तो आप वास्तव में C ++ का उपयोग नहीं कर रहे हैं; आप Objective-C ++ का उपयोग कर रहे हैं, जो अधिकांश C ++ को इनपुट के रूप में स्वीकार करता है (उसी तरह जैसे कि C ++ सबसे अधिक नहीं, लेकिन सभी C को इनपुट के रूप में स्वीकार करता है)। जब मैं कहता हूं कि यह काफी C ++ नहीं है, तो C ++ फ़ाइल पर विचार करें जिसमें एक चर नाम है nil
(जो कानूनी C ++ है) और फिर इसे Objective-C ++ के रूप में संकलित करने का प्रयास करें।
स्विफ्ट का समान संबंध नहीं है। यह C या C ++ का सुपरसेट नहीं है, और आप सीधे किसी .swift
फ़ाइल में उपयोग नहीं कर सकते ।
"स्विफ्ट विद कोको एंड ऑब्जेक्टिव-सी" का उपयोग भी हमें बताता है:
आप C ++ कोड को सीधे स्विफ्ट में आयात नहीं कर सकते। इसके बजाय, C ++ कोड के लिए एक उद्देश्य-सी या सी आवरण बनाएं।
.mm
अपनी फ़ाइलों को जा सकते हैं और (लगभग) किया जा सकता है। स्विफ्ट के साथ ऐसा नहीं है।
nil
, जैसेint nil
भ्रम की स्थिति इस धारणा से आ सकती है कि केवल से एक फ़ाइल एक्सटेंशन बदल .m
करने के लिए .mm
आप सभी की, भाषाओं को पाटने के लिए जब, वास्तव में, यह है कि ऐसा कुछ नहीं करता है की जरूरत है। ऐसा नहीं है .mm
कि .cpp
यह घर्षण का कारण बनता है , यह .h
हेडर है जो सकारात्मक रूप से हेडर नहीं होना चाहिए C++
।
में एक ही परियोजना, आप खुशी से मिश्रण कर सकते हैं सी , सी ++ , ऑब्जेक्टिव-सी , उद्देश्य सी ++ , स्विफ्ट , और यहां तक कि विधानसभा ।
...Bridging-Header.h
: आप इस पुल का उपयोग करके सी , ऑब्जेक्टिव-सी और ऑब्जेक्टिव-सी ++ को एक्सपोज करते हैं<ProductModuleName>-Swift.h
: स्वचालित रूप से अपने स्विफ्ट कक्षाओं @objc
को उद्देश्य-सी के साथ चिह्नित करता है.h
: यह मुश्किल हिस्सा है, क्योंकि वे अस्पष्ट रूप से C , ++ या नहीं, उद्देश्य या नहीं के सभी स्वादों के लिए उपयोग किए जाते हैं । जब एक .h
एकल C ++ कीवर्ड शामिल नहीं होता है , जैसे class
, इसे जोड़ा जा सकता है ...Bridging-Header.h
, और जो भी फ़ंक्शन .c
या .cpp
फ़ंक्शन इसे घोषित करता है, वह कार्य करेगा। अन्यथा, उस हेडर को या तो शुद्ध सी या ऑब्जेक्टिव-सी एपीआई में लपेटा जाना चाहिए ।एक ही फ़ाइल में, आप सभी को नहीं मिला सकते हैं। एक ही स्रोत फ़ाइल में :
.swift
: आप स्विफ्ट को कुछ भी नहीं मिला सकते हैं.m
: आप मिश्रण कर सकते हैं ऑब्जेक्टिव-सी के साथ सी । ( @Vinzzz ).mm
: आप C ++ के साथ ऑब्जेक्टिव-सी मिला सकते हैं । यह पुल ऑब्जेक्टिव-सी ++ है । ( @Vinzzz )।.c
: शुद्ध सी.cpp
: आप C ++ और असेंबली ( @Vality ) को मिला सकते हैं.h
: सर्वव्यापी और अस्पष्ट C , C ++ , Objective-C या Objective-C ++ , इसलिए इसका उत्तर यह निर्भर करता है।संदर्भ
मैंने एक सरल Xcode 6 प्रोजेक्ट लिखा, जिसमें C ++, ऑब्जेक्टिव C और स्विफ्ट कोड को मिक्स करने का तरीका दिखाया गया है:
https://github.com/romitagl/shared/tree/master/C-ObjC-Swift/Performance_Console
विशेष रूप से उदाहरण स्विफ्ट से एक उद्देश्य सी और एक सी ++ फ़ंक्शन को कॉल करता है।
कुंजी एक साझा हेडर प्रोजेक्ट-ब्रिजिंग-हेडर बनाने के लिए है और वहां उद्देश्य सी हेडर डालते हैं।
कृपया प्रोजेक्ट को पूर्ण उदाहरण के रूप में डाउनलोड करें।
ObjCtoCPlusPlus.h
/ `` .mm` C ++ कोड को Ob-C इंटरफ़ेस प्रदान करने के एकमात्र उद्देश्य के लिए मौजूद है- यह पुल है, जो यहां एक आवश्यक घटक है। जहां वे हैं, वहां शामिल करें और ObjCtoCPlusPlus.…
प्रत्येक C ++ विधि के लिए फ़ाइलों में एक विधि जोड़ें, जिनकी आपको आवश्यकता है। आप sourcemaking.com/design_patterns/adapter
आप बीच - बीच में ऑब्जेक्टिव-सी फाइल को भी छोड़ सकते हैं । बस .cpp स्रोत फ़ाइल के साथ C हेडर फ़ाइल जोड़ें। हेडर फ़ाइल में केवल C घोषणाएँ हैं और स्रोत फ़ाइल में कोई C ++ कोड शामिल करें। फिर सी हेडर फ़ाइल को ** - ब्रिजिंग-हेडर.ह में शामिल करें।
निम्न उदाहरण एक C ++ ऑब्जेक्ट (स्ट्रक्चर फू) के लिए एक पॉइंटर लौटाता है, इसलिए स्विफ्ट वैश्विक फ़ू में परिभाषित किए गए स्ट्रक्चर फू को परिभाषित करने के बजाय एक COpaquePointer में स्टोर कर सकता है।
Foo.h फ़ाइल (स्विफ्ट द्वारा देखी गई - ब्रिजिंग फ़ाइल में शामिल)
#ifndef FOO_H
#define FOO_H
// Strictly C code here.
// 'struct Foo' is opaque (the compiler has no info about it except that
// it's a struct we store addresses (pointers) to it.
struct Foo* foo_create();
void foo_destroy(struct Foo* foo);
#endif
अंदर स्रोत फ़ाइल Foo.cpp (स्विफ्ट द्वारा नहीं देखी गई):
extern "C"
{
#include "Foo.h"
}
#include <vector>
using namespace std;
// C++ code is fine here. Can add methods, constructors, destructors, C++ data members, etc.
struct Foo
{
vector<int> data;
};
struct Foo* foo_create()
{
return new Foo;
}
void foo_destroy(struct Foo* foo)
{
delete foo;
}
extern "C"
हेडर को उस जगह पर लपेटा है जहाँ वह #ifdef
हेडर फ़ाइल में एड के बजाय शामिल है। प्रतिभाशाली!
मैंने सिर्फ स्विफ्ट, ऑब्जेक्टिव-सी और सी ++ का उपयोग करके एक छोटा सा उदाहरण प्रोजेक्ट बनाया है। यह iOS में OpenCV सिलाई का उपयोग करने का एक डेमो है। OpenCV एपीआई C ++ है इसलिए हम स्विफ्ट से सीधे इस पर बात नहीं कर सकते हैं। मैं एक छोटे रैपर वर्ग का उपयोग करता हूं, जिसका कार्यान्वयन फ़ाइल ऑब्जेक्टिव-सी ++ है। हैडर तो स्विफ्ट सीधे इस बात कर सकते हैं फ़ाइल, स्वच्छ ऑब्जेक्टिव-सी है। आपको ध्यान रखना है कि किसी भी C ++ - ish फ़ाइलों को अप्रत्यक्ष रूप से आयात न करें जो कि हेडर में है जो स्विफ्ट के साथ इंटरैक्ट करता है।
परियोजना यहां है: https://github.com/foundry/OpenCVSwiftStitch
यहां C ++ / स्विफ्ट संचार को स्वचालित करने के लिए एक क्लैंग टूल पर मेरा प्रयास है। आप C ++ क्लासेस को स्विफ्ट से, C ++ क्लास से इनहेरिट कर सकते हैं और यहां तक कि स्विफ्ट में वर्चुअल तरीके भी ओवरराइड कर सकते हैं।
यह C ++ वर्ग को पार्स करेगा जिसे आप अपने आप ही Objective-C / Objective-C ++ ब्रिज को स्विफ्ट और जेनरेट करने के लिए एक्सपोर्ट करना चाहते हैं।
स्विफ्ट सी ++ के साथ सीधे संगत नहीं है। आप अपने C ++ कोड को ऑब्जेक्टिव-C के साथ लपेटकर, और स्विफ्ट में ऑब्जेक्टिव C रैपर का उपयोग करके समस्या का समाधान कर सकते हैं।
मेरे पास स्विपन संयोजन के लिए भी एक डेमो प्रोग्राम है।
आप इसे https://github.com/russj/swift_opencv3_demo से डाउनलोड कर सकते हैं ।
डेमो के बारे में अधिक जानकारी http://flopalm.com/opencv-with-swift/ ।
नहीं, एक भी फाइल में नहीं।
हालांकि, आप स्विफ्ट प्रोजेक्ट्स में C ++ का उपयोग स्टैटिक लाइब्रेरी या फ्रेमवर्क की आवश्यकता के बिना कर सकते हैं। जैसा कि अन्य लोगों ने कहा है, कुंजी एक ऑब्जेक्टिव-सी ब्रिजिंग हेडर बनाने के लिए है जो सी-संगत C ++ हेडर को #includes करता है जिसे एक्सटर्नल "C" {} ट्रिक के साथ C संगत के रूप में चिह्नित किया गया है ।
वीडियो ट्यूटोरियल: https://www.youtube.com/watch?v=0x6JbiphNS4
अन्य उत्तर थोड़े गलत हैं। आप वास्तव में स्विफ्ट और [ऑब्जेक्टिव-] C [++] दोनों को एक ही फाइल में मिला सकते हैं, हालांकि आप जिस तरह से उम्मीद करेंगे, वैसा नहीं।
यह फ़ाइल (c.swift) एक मान्य निष्पादन योग्य दोनों के साथ संकलित करती है swiftc c.swift
औरclang -x objective-c c.swift
/* /* */
#if 0
// */
import Foundation
print("Hello from Swift!")
/* /* */
#endif
#include <stdio.h>
int main()
{
puts("Hello from C!");
return 0;
}
// */
एक चाल (कई की) है
आप केवल। में और @ फ़ाइल को एक ही .mm फ़ाइल में नहीं फेंक सकते हैं क्योंकि एक सामान्य रूप से अक्सर होता है।
तो आपके ब्रिजिंग हेडर फ़ाइल में आपके पास है
#import "Linkage.hpp"
Linkage.hpp में लिंकेज के लिए @interface और Linkage.mm के पास .mm के लिए @ कार्यान्वयन है
और तब
आप केवल #include "yourCpp.hpp"
लिंकेज.एमएम फाइल में लगाएं, लिंकेज.एचपी फाइल में नहीं ।
कई ऑनलाइन उदाहरणों / ट्यूटोरियल्स में, लेखक केवल .mm फ़ाइल में @interface और @ कार्यान्वयन लागू करता है, जैसा कि अक्सर होता है।
यह बहुत ही सरल cpp ब्रिजिंग उदाहरणों में काम करेगा, लेकिन,
यह समस्या है:
यदि आपके cpp.hpp में कोई भी c ++ विशेषताएँ हैं, जो निश्चित रूप से यह (जैसे, पहली पंक्ति #include <something>
) होगी, तो प्रक्रिया विफल हो जाएगी।
लेकिन अगर आप नहीं करते है #include "yourCpp.hpp"
लिंकेज में हैडर फ़ाइल (यह ठीक .mm फ़ाइल में है, स्पष्ट रूप से आप की आवश्यकता होगी) - यह काम करता है।
फिर से यह दुर्भाग्य से पूरी प्रक्रिया में सिर्फ एक टिप है।
यदि यह किसी के लिए उपयोगी है, तो मेरे पास एक सामान्य सी ++ स्टेटिक लाइब्रेरी को एक तुच्छ स्विफ्ट कमांड लाइन उपयोगिता से कॉल करने पर एक संक्षिप्त ट्यूटोरियल है। यह कोड के कॉन्सेप्ट पीस का वास्तव में नंगे-हड्डियों का प्रमाण है।
कोई उद्देश्य-सी शामिल नहीं है, बस स्विफ्ट और सी ++। C ++ लाइब्रेरी में कोड को C ++ रैपर द्वारा कहा जाता है जो एक्सटर्नल "C" लिंकेज के साथ एक फंक्शन को कार्यान्वित करता है। उस फ़ंक्शन को ब्रिजिंग हेडर में संदर्भित किया जाता है और स्विफ्ट से बुलाया जाता है।
मैं आधिकारिक संसाधन में SE-0038 का लिंक प्रदान कर रहा हूं , जैसा कि यह बताया गया है कि यह स्विफ्ट प्रोग्रामिंग लैंग्वेज में बदलाव और उपयोगकर्ता-दृश्यमान संवर्द्धन के प्रस्तावों को बनाए रखता है।
आज की स्थिति यह है कि यह सुविधा अनुरोध है जिसे स्वीकार किया गया है लेकिन अभी तक निर्धारित नहीं है।
यह लिंक सही दिशा में इस सुविधा की तलाश में किसी को भी चलाने का इरादा है