উত্তর:
না। যখন আপনি .m থেকে .mm তে স্যুইচ করেন আপনি আসলে অবজেক্টিভ সি থেকে আলাদা ভাষায় (যার অনেক সূক্ষ্ম পার্থক্য রয়েছে) অবজেক্টিভ-সি ++ নামে স্যুইচ করছেন। সুতরাং আপনি সত্যিই সি ++ ব্যবহার করছেন না; আপনি অবজেক্টিভ-সি ++ ব্যবহার করছেন যা বেশিরভাগ সি ++ কে ইনপুট হিসাবে গ্রহণ করে (একইভাবে সি ++ সর্বাধিক গ্রহণ করে তবে সমস্ত সি ইনপুট হিসাবে গ্রহণ করে না)। আমি যখন বলি এটি একেবারে সি ++ নয়, তখন একটি সি ++ ফাইল বিবেচনা করুন যার মধ্যে একটি ভেরিয়েবল nil
(যা আইনী সি ++) অন্তর্ভুক্ত থাকে এবং তারপরে সেটিকে উদ্দেশ্য-সি ++ হিসাবে সংকলনের চেষ্টা করুন।
সুইফটের একই সম্পর্ক নেই। এটি সি বা সি ++ এর সুপারসেট নয় এবং আপনি সরাসরি কোনও .swift
ফাইলে ব্যবহার করতে পারবেন না ।
"সুইচ উইথ কোকো এবং অবজেক্টিভ-সি" ব্যবহার আমাদেরও বলে:
আপনি সরাসরি সুইফটে সি ++ কোড আমদানি করতে পারবেন না। পরিবর্তে, সি ++ কোডের জন্য একটি উদ্দেশ্য-সি বা সি মোড়ক তৈরি করুন।
.mm
নিজের ফাইলগুলিতে যেতে পারেন (প্রায়) সম্পন্ন করে নিতে পারেন। সুইফ্টের সাথে তেমন নয়।
nil
, যেমনint nil
বিভ্রান্তি এই ধারণা থেকে আসতে পারে যে কেবলমাত্র ভাষা এক্সপ্লোর .m
করার .mm
জন্য আপনার কেবল ফাইল এক্সটেনশন পরিবর্তন করা দরকার, যখন বাস্তবে, এটি এই ধরণের কিছুই করে না। এটা তোলে নয় .mm
যে সঙ্গে ঘর্ষণ কারণ .cpp
, এটা .h
হেডার যা ইতিবাচক একটি হবে না C++
হেডার।
ইন একই প্রকল্প, আপনি আনন্দের সাথে মিশ্রিত করা যাবে সি , সি ++ , উদ্দেশ্য সি , উদ্দেশ্য সি ++ , সুইফট , এবং এমনকি পরিষদের ।
...Bridging-Header.h
: আপনি এক্সপোজ সি , উদ্দেশ্য সি এবং উদ্দেশ্য সি ++ করার সুইফট এই ব্রিজ ব্যবহার<ProductModuleName>-Swift.h
: অনাবৃত স্বয়ংক্রিয়ভাবে আপনার সুইফট দিয়ে চিহ্নিত শ্রেণীর @objc
করার উদ্দেশ্য সি.h
: এটি কৌশলপূর্ণ অংশ, যেহেতু সেগুলি অস্পষ্টভাবে সি , ++ বা না সমস্ত উদ্দেশ্যগুলির জন্য ব্যবহার করা হয় , উদ্দেশ্য বা না। যখন .h
একটিতে একটি সি সি ++ কীওয়ার্ড থাকে না , যেমন class
এটি যুক্ত করা যায় ...Bridging-Header.h
, এবং এটি সম্পর্কিত .c
বা .cpp
কার্যকরীতার যে কোনও ক্রিয়াকলাপটি প্রকাশ করে। অন্যথায়, সেই শিরোনামটি অবশ্যই একটি খাঁটি সি বা উদ্দেশ্য-সি এপিআইতে আবৃত থাকতে হবে ।ইন একই ফাইল, আপনি মিশ্রিত করা যাবে না সব 5. একই সালে সোর্স ফাইল :
.swift
: আপনি সুইফটকে কোনও কিছুর সাথে মিশতে পারবেন না.m
: আপনি মিশ্রিত করা যাবে উদ্দেশ্য সি সঙ্গে সি । ( @ ভিনজজ ).mm
: আপনি সি ++ এর সাথে উদ্দেশ্য-সি মিশ্রণ করতে পারেন । এই সেতুটি অবজেক্টিভ-সি ++ । ( @ ভিনজজ )।.c
: খাঁটি গ.cpp
: আপনি সি ++ এবং এসেম্বলিতে মিশ্রণ করতে পারেন ( @ ভ্যালি ).h
: সর্বব্যাপী এবং অস্পষ্ট সি , সি ++ , উদ্দেশ্য-সি বা উদ্দেশ্য-সি ++ , সুতরাং উত্তরটি এটি নির্ভর করে itতথ্যসূত্র
আমি একটি সাধারণ এক্সকোড 6 প্রকল্প লিখেছিলাম যা দেখায় কীভাবে সি ++, উদ্দেশ্য সি এবং সুইফ্ট কোডটি মিশ্রিত করতে হবে:
https://github.com/romitagl/shared/tree/master/C-ObjC-Swift/Performance_Console
বিশেষত উদাহরণটি একটি উদ্দেশ্য সি এবং সুইফট থেকে একটি সি ++ ফাংশন কল করে।
কীটি হ'ল একটি ভাগ করা শিরোনাম প্রোজেক্ট-ব্রিজিং-শিরোলেখ তৈরি করুন এবং সেখানে উদ্দেশ্য সি শিরোনাম স্থাপন করুন।
প্রকল্পটি সম্পূর্ণ উদাহরণ হিসাবে ডাউনলোড করুন।
ObjCtoCPlusPlus.h
/ `to .mm` সি ++ কোডে একটি ওব-সি ইন্টারফেস সরবরাহের একমাত্র উদ্দেশ্যে উপস্থিত রয়েছে — এটি সেতুটি, যা এখানে প্রয়োজনীয় উপাদান। যেখানে রয়েছে সেগুলি অন্তর্ভুক্ত করুন ObjCtoCPlusPlus.…
এবং প্রতিটি সি ++ পদ্ধতির জন্য আপনার অ্যাক্সেসের প্রয়োজন ফাইলে একটি পদ্ধতি যুক্ত করুন । সোর্স মেকিং
এর মধ্যে আপনি ওজেক্টিভ-সি ফাইলটি এড়িয়ে যেতে পারেন । একটি .cpp উত্স ফাইল সহ একটি সি হেডার ফাইল যুক্ত করুন। হেডার ফাইলটিতে কেবল সি ঘোষণা রয়েছে এবং উত্স ফাইলে যে কোনও সি ++ কোড অন্তর্ভুক্ত রয়েছে। তারপরে ** - ব্রিজিং-শিরোনামে সি হেডার ফাইল অন্তর্ভুক্ত করুন।
নিম্নলিখিত উদাহরণটি সি ++ অবজেক্টে (স্ট্রাক্ট ফু) একটি পয়েন্টার দেয় যাতে সুইফট বিশ্বজুড়ে স্ট্রাক্ট ফু সংজ্ঞায়নের পরিবর্তে একটি সিপেকপয়েন্টারে সংরক্ষণ করতে পারে।
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
শিরোনামটি অন্তর্ভুক্ত করা জায়গায় মোড়ানো দেখেছি । উজ্জ্বল!
আমি স্যুইফ্ট, অবজেক্টিভ-সি এবং সি ++ ব্যবহার করে সামান্য উদাহরণ প্রকল্প তৈরি করেছি। আইওএসে কীভাবে ওপেনসিভি সেলাই ব্যবহার করা যায় তার একটি ডেমো। ওপেনসিভি এপিআই হ'ল সি ++ তাই আমরা সুইফট থেকে সরাসরি এটির সাথে কথা বলতে পারি না। আমি একটি ছোট র্যাপার ক্লাস ব্যবহার করি যার বাস্তবায়ন ফাইলটি হ'ল অবজেক্টিভ-সি ++। শিরোলেখ তাই সুইফট সরাসরি এই কথা বলতে পারেন ফাইল, পরিষ্কার উদ্দেশ্য সি হয়। সুইফট ইন্টারেক্ট করে এমন শিরোনামগুলিতে পরোক্ষভাবে কোনও সি ++ - ইশ ফাইলগুলি আমদানি না করার জন্য আপনাকে যত্ন নিতে হবে।
প্রকল্পটি এখানে: https://github.com/foundry/OpenCVSwiftStitch
সি ++ / দ্রুত যোগাযোগটি স্বয়ংক্রিয় করার জন্য একটি ঝনঝন সরঞ্জামে আমার প্রচেষ্টা এখানে। আপনি সুইফ্ট থেকে সি ++ ক্লাস ইনস্ট্যান্ট করতে পারবেন, সি ++ ক্লাস থেকে উত্তরাধিকার পেতে পারেন এবং এমনকি সুইফটে ভার্চুয়াল পদ্ধতিগুলি ওভাররাইড করতে পারেন।
এটি স্বয়ংক্রিয়ভাবে অবজেক্টিভ-সি / অবজেক্টিভ-সি ++ ব্রিজটি উত্পন্ন করতে এবং উত্পন্ন করতে রফতানি করতে চাইলে সি ++ শ্রেণিটি বিশ্লেষণ করবে।
সুইফট সরাসরি সি ++ এর সাথে সামঞ্জস্য নয়। আপনি আপনার সি ++ কোডটি অবজেক্টিভ-সি দিয়ে মোড়ানো এবং সুইফটে অবজেক্টিভ সি র্যাপার ব্যবহার করে ইস্যুটি নিয়ে কাজ করতে পারেন।
আমার কাছে ওপেনসিভি সংযুক্ত করার জন্য একটি ডেমো প্রোগ্রাম রয়েছে।
আপনি এটি https://github.com/russj/swift_opencv3_demo থেকে ডাউনলোড করতে পারেন ।
ডেমো সম্পর্কে আরও তথ্য http://flopalm.com/opencv-with-swift/ ।
না, একক ফাইলে নয়।
তবে, আপনি স্ট্যাটিক লাইব্রেরি বা কাঠামোর প্রয়োজন ছাড়াই সুইফ্ট প্রকল্পগুলিতে সি ++ ব্যবহার করতে পারেন। অন্যরা যেমন বলেছেন, মূলত হ'ল একটি উদ্দেশ্য-সি ব্রিজিং শিরোনাম যা # বহিরাগত "সি" {} ট্রিকের সাথে সি হিসাবে সামঞ্জস্যপূর্ণ সি + সামঞ্জস্যপূর্ণ সি ++ শিরোনাম অন্তর্ভুক্ত করে।
ভিডিও টিউটোরিয়াল: https://www.youtube.com/watch?v=0x6JbiphNS4
অন্যান্য উত্তরগুলি কিছুটা ভুল। আপনি একই ধরণের সুইফ এবং [উদ্দেশ্য-] সি [++] উভয়কে একই ফাইলে মিশ্রিত করতে পারেন, যদিও আপনার প্রত্যাশা মতো নয়।
এই ফাইলটি (সি। সুইফট) উভয় 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;
}
// */
একটি কৌশল (অনেকের) হ'ল তা
আপনি সাধারণত @ ইনটারফেস এবং @ ইমপ্লিমেন্টেশন একই। মিমি ফাইলটিতে ফেলে দিতে পারবেন না যেহেতু প্রায়শই সাধারণত হয়।
সুতরাং আপনার ব্রিজিং হেডার ফাইলটিতে
#import "Linkage.hpp"
Linkage.hpp এর লিঙ্কেজের জন্য @ অভ্যন্তরীণ পৃষ্ঠ রয়েছে এবং লিংকেজ.এমএম। এমএম এর @ বাস্তবায়ন রয়েছে
এবং তারপর
আপনি শুধুমাত্র করা #include "yourCpp.hpp"
Linkage.mm ফাইলে, না Linkage.hpp ফাইলে।
অনেক অনলাইন উদাহরণ / টিউটোরিয়ালে লেখক কেবল @ ইনটারফেস এবং @ ইমপ্লিমেন্টেশনটিকে একই .mm ফাইলে রাখেন, যেমনটি প্রায়শই হয়।
এটি খুব সাধারণ সিপিপি ব্রিজিং উদাহরণগুলিতে কাজ করবে, কিন্তু,
সমস্যা হল:
যদি আপনার সিপিএইচপি এইচপি-তে কোনও সি ++ বৈশিষ্ট্য রয়েছে যা এটি অবশ্যই পছন্দ করবে (যেমন, প্রথম লাইন #include <something>
), তবে প্রক্রিয়া ব্যর্থ হবে।
কিন্তু আপনি শুধু না আছে #include "yourCpp.hpp"
লিঙ্কেজ মধ্যে হেডার ফাইল (এটা জরিমানা .mm ফাইলে এটা আছে অবশ্যই আপনি করতে হবে) - এটি কাজ করে।
আবার এটি দুর্ভাগ্যক্রমে পুরো প্রক্রিয়াতে একটি টিপ।
এটি যদি কারও পক্ষে সহায়ক হয় তবে একটি তুচ্ছ সুইফ্ট কমান্ড লাইন ইউটিলিটি থেকে একটি সাধারণ সি ++ স্ট্যাটিক লাইব্রেরি কল করার বিষয়ে আমার একটি সংক্ষিপ্ত টিউটোরিয়ালও রয়েছে। কোডের ধারণা পিসের এটি সত্যিই নগ্ন হাড়ের প্রমাণ।
কোনও উদ্দেশ্য-সি জড়িত নেই, কেবল সুইফ্ট এবং সি ++। সি ++ লাইব্রেরিতে কোডকে সি ++ র্যাপার বলে that সেই ফাংশনটি ব্রিজিং শিরোনামে উল্লেখ করা হয় এবং সুইফ্ট থেকে কল করা হয়।
আমি সরকারী সংস্থায় SE-0038 এ একটি লিঙ্ক সরবরাহ করছি , এটি হিসাবে বর্ণনা করা হয়েছে যা এটি সুইফ্ট প্রোগ্রামিং ভাষাতে পরিবর্তন এবং ব্যবহারকারীদের দ্বারা দৃশ্যমান বর্ধনের জন্য প্রস্তাবগুলি বজায় রাখে।
আজকের স্থিতিটি হ'ল এটি বৈশিষ্ট্যটির অনুরোধ যা গ্রহণ করা হয়েছে তবে এখনও নির্ধারিত হয়নি।
এই লিঙ্কটি সঠিক দিক দিয়ে এই বৈশিষ্ট্যটির জন্য যে কেউ খুঁজছেন তা চালিত করার উদ্দেশ্যে