আমি কীভাবে সুইফট থেকে অবজেক্টিভ-সি কোড কল করব?


974

সুইফটে, কীভাবে একজন অবজেক্টিভ-সি কোড কল করে?

অ্যাপল উল্লেখ করেছে যে তারা একটি প্রয়োগে সহ-অস্তিত্ব থাকতে পারে, তবে এর অর্থ কি এই যে সুইচটে নতুন ক্লাস নির্মাণের সময় অবজেক্টিভ সি-তে তৈরি পুরানো শ্রেণিগুলি প্রযুক্তিগতভাবে পুনরায় ব্যবহার করতে পারে?




10
আকর্ষণীয় যে এই প্রশ্নটি অনেকগুলি উত্সাহ এবং একটি অনুগ্রহ লাভ করে। আমি যখন এটি প্রথম দেখলাম তখন আমি কেবল ভেবেছিলাম: আরটিএফএম। উত্থাপিত হিসাবে এটি সত্যই কোনও গবেষণা দেখায় না কারণ বর্তমানে কেবল দুটি বা তিনটি সংস্থান রয়েছে যা আনুষ্ঠানিকভাবে সুইফটকে নথিভুক্ত করে, এবং এর মধ্যে একটি সম্পূর্ণরূপে এটির জন্য নিবেদিত (এবং প্রথম মন্তব্যে এর সাথে যুক্ত)।
অ্যানালগ ফাইল

6
@ এভলগেট: অবজেক্টিভ সি থেকে ঠিক কী অনুপস্থিত যা এটিকে প্ল্যাটফর্মের স্বাধীন ভাষা হতে বাধা দেয়? ভাষা এবং ভাষার মানক গ্রন্থাগারগুলি ওপেন সোর্স। আপনি উইন্ডোজ, ওস এক্স, লিনাক্স, বিএসডি, সোলারিস এবং অন্য কোনও প্ল্যাটফর্মের জন্য জিসিসি বা এলএলভিএম দ্বারা সমর্থিত অবজেক্টিভ সি ব্যবহার করতে পারেন। আপনি জিসিসি বা এলএলভিএম না দিয়ে সমর্থন করলেও আপনি সহজেই কোনও শালীন সি সংকলক সহ কোনও প্ল্যাটফর্মে অবজেক্টিভ সি পোর্ট করতে পারেন। এর চেয়ে কীভাবে এটি আরও বেশি প্ল্যাটফর্ম হতে পারে তা আমি দেখছি না।
অ্যানালগ ফাইল

2
@ ডেভিড মাল্ডার: "যুক্তি" বিভাগটি এখনও দরকার?
ফ্র্যাঙ্ক

উত্তর:


1392

সুইফটে অবজেক্টিভ-সি ক্লাস ব্যবহার করা

আপনি যদি ব্যবহার করতে চান এমন কোনও বিদ্যমান শ্রেণি থাকে তবে পদক্ষেপ 2 সম্পাদন করুন এবং তারপরে পদক্ষেপ 5 এ যান । (কিছু ক্ষেত্রে, আমাকে #import <Foundation/Foundation.hএকটি পুরানো উদ্দেশ্য-সি ফাইলে একটি স্পষ্ট যোগ করতে হয়েছিল))

পদক্ষেপ 1: উদ্দেশ্য-সি বাস্তবায়ন যুক্ত করুন - মি

.mআপনার ক্লাসে একটি ফাইল যুক্ত করুন এবং নাম দিন CustomObject.m

পদক্ষেপ 2: ব্রিজিং শিরোনাম যুক্ত করুন

আপনার .mফাইল যুক্ত করার সময়, সম্ভবত আপনাকে এমন একটি প্রম্পট দিয়ে আঘাত করা হবে:

আপনি "" একটি উদ্দেশ্য-সি ব্রিজিং শিরোনামটি কনফিগার করতে চান "তা জিজ্ঞাসা করে এক্সকোডের একটি ম্যাকোস শিট-স্টাইল ডায়ালগ

হ্যাঁ ক্লিক করুন !

আপনি যদি প্রম্পটটি না দেখেন বা দুর্ঘটনাক্রমে আপনার ব্রিজিং শিরোনামটি মুছে ফেলে থাকেন তবে .hআপনার প্রকল্পে একটি নতুন ফাইল যুক্ত করুন এবং নাম দিন <#YourProjectName#>-Bridging-Header.h

কিছু পরিস্থিতিতে, বিশেষত অবজেক্টিভ-সি ফ্রেমওয়ার্কগুলির সাথে কাজ করার সময়, আপনি স্পষ্টভাবে একটি উদ্দেশ্য-সি ক্লাস যুক্ত করবেন না এবং এক্সকোড লিঙ্কারটি খুঁজে পাবে না। এই ক্ষেত্রে, .hউপরে উল্লিখিত হিসাবে আপনার ফাইলটি তৈরি করুন , তারপরে নিশ্চিত হয়ে নিন যে আপনি আপনার টার্গেটের প্রকল্পের সেটিংসে এর পথটি লিঙ্ক করেছেন:

উপরের অনুচ্ছেদে প্রদর্শিত একটি অ্যানিমেশন

বিঃদ্রঃ:

আপনার প্রকল্পটি $(SRCROOT)ম্যাক্রো ব্যবহার করে সংযুক্ত করার পক্ষে সর্বোত্তম অনুশীলন যাতে আপনি যদি আপনার প্রকল্পটি সরিয়ে নিয়ে যান বা অন্যের সাথে এটি রিমোট রিপোজিটরি ব্যবহার করে কাজ করেন তবে এটি এখনও কার্যকর হবে। $(SRCROOT)আপনার .xcodeproj ফাইল রয়েছে এমন ডিরেক্টরি হিসাবে ভাবা যেতে পারে। এটি দেখতে এটির মতো দেখাবে:

$(SRCROOT)/Folder/Folder/<#YourProjectName#>-Bridging-Header.h

পদক্ষেপ 3: উদ্দেশ্য-সি শিরোনাম যুক্ত করুন -। H

অন্য একটি .hফাইল যুক্ত করুন এবং নাম দিন CustomObject.h

পদক্ষেপ 4: আপনার উদ্দেশ্য-সি ক্লাস তৈরি করুন

ভিতরে CustomObject.h

#import <Foundation/Foundation.h>

@interface CustomObject : NSObject

@property (strong, nonatomic) id someProperty;

- (void) someMethod;

@end

ভিতরে CustomObject.m

#import "CustomObject.h"

@implementation CustomObject 

- (void) someMethod {
    NSLog(@"SomeMethod Ran");
}

@end

পদক্ষেপ 5: ব্রিজিং-শিরোনামে ক্লাস যুক্ত করুন

ইন YourProject-Bridging-Header.h:

#import "CustomObject.h"

পদক্ষেপ:: আপনার অবজেক্টটি ব্যবহার করুন

ইন SomeSwiftFile.swift:

var instanceOfCustomObject = CustomObject()
instanceOfCustomObject.someProperty = "Hello World"
print(instanceOfCustomObject.someProperty)
instanceOfCustomObject.someMethod()

সুস্পষ্টভাবে আমদানি করার দরকার নেই; ব্রিজিং শিরোলেখ এটিই।

উদ্দেশ্য-সি তে সুইফ্ট ক্লাস ব্যবহার করা

পদক্ষেপ 1: নতুন সুইফ্ট ক্লাস তৈরি করুন

.swiftআপনার প্রকল্পে একটি ফাইল যুক্ত করুন এবং নাম দিন MySwiftObject.swift

ইন MySwiftObject.swift:

import Foundation

@objc(MySwiftObject)
class MySwiftObject : NSObject {

    @objc
    var someProperty: AnyObject = "Some Initializer Val" as NSString

    init() {}

    @objc
    func someFunction(someArg: Any) -> NSString {
        return "You sent me \(someArg)"
    }
}

পদক্ষেপ 2: ওবিজেসি ক্লাসে সুইফট ফাইলগুলি আমদানি করুন

ইন SomeRandomClass.m:

#import "<#YourProjectName#>-Swift.h"

ফাইলটি: <#YourProjectName#>-Swift.hইতিমধ্যে আপনার প্রকল্পে স্বয়ংক্রিয়ভাবে তৈরি করা উচিত, আপনি এটি দেখতে না পারলেও।

পদক্ষেপ 3: আপনার ক্লাস ব্যবহার করুন

MySwiftObject * myOb = [MySwiftObject new];
NSLog(@"MyOb.someProperty: %@", myOb.someProperty);
myOb.someProperty = @"Hello World";
NSLog(@"MyOb.someProperty: %@", myOb.someProperty);

NSString * retString = [myOb someFunctionWithSomeArg:@"Arg"];

NSLog(@"RetString: %@", retString);

মন্তব্য:

  1. কোড কমপ্লিটেশন আপনার প্রত্যাশা অনুযায়ী আচরণ না করলে এক্সকোডকে Rএকটি সুইফ্ট প্রসঙ্গে এবং এর বিপরীতে কিছু উদ্দেশ্য-সি কোড খুঁজে পেতে সহায়তা করার জন্য একটি দ্রুত বিল্ড চালানোর চেষ্টা করুন ।

  2. আপনি যদি .swiftকোনও পুরানো প্রকল্পে একটি ফাইল যুক্ত করেন এবং ত্রুটিটি পান তবে এক্সকোডটিdyld: Library not loaded: @rpath/libswift_stdlib_core.dylib সম্পূর্ণ পুনরায় চালু করার চেষ্টা করুন ।

  3. প্রিফিক্সটি NSObjectব্যবহার করে অবজেক্টিভ-সি-তে দৃশ্যমান খাঁটি সুইফ্ট ক্লাসগুলি (এর বংশধর নয় ) ব্যবহার করা প্রাথমিকভাবে সম্ভব ছিল @objc, এটি আর সম্ভব নয়। এখন, অবজেক্টিভ-সিতে দৃশ্যমান হওয়ার জন্য, সুইফট অবজেক্টটি হয় অবশ্যই মানানসই একটি শ্রেণি হতে হবে NSObjectProtocol(এটি করার সহজতম উপায় হ'ল উত্তরাধিকারসূত্রে প্রাপ্ত হওয়া NSObject), বা কোনও সংখ্যার মতো কাঁচা মান সহ enumচিহ্নিত হওয়া উচিত । আপনি এই বিধিনিষেধ ছাড়াই সুইফট 1.x কোডের উদাহরণের জন্য সম্পাদনা ইতিহাস দেখতে পারেন @objcInt@objc


5
আপনার কাছে @objc বা টেমপ্লেটগুলির সাথে সুইট পদ্ধতি অবলম্বন করা গুরুত্বপূর্ণ, অবজেক্টিভ-সি থেকে দৃশ্যমান হবে না।
টমো লিনহার্ট

29
তুমি ঠিক. আপনি যদি কোকো অবজেক্ট ব্যবহার না করেন তবে আপনাকে কেবল এটি নির্দিষ্ট করতে হবে। অবজেক্টিভ-সি-তে অ্যাক্সেসযোগ্য এবং ব্যবহারযোগ্য হওয়ার জন্য, একটি সুইফ্ট শ্রেণি অবশ্যই একটি উদ্দেশ্য-সি শ্রেণীর বংশধর হতে হবে বা এটি অবশ্যই @objc চিহ্নিত করতে হবে।
টমো লিনহার্ট

2
@ মারকাস রাউতোপুরো - এখান থেকে পেয়েছেন: বিকাশকারী.অ্যাপল. com/ লাইব্রেরি / প্রিরিলেস / আইসস / ডকুমেন্টেশন / সুইফট/… "
লোগান

2
আরও দেখুন: ডাব্লুডাব্লুডিসি 2014 সেশন 406: উদ্দেশ্য-সি এর সাথে সুইফ্টকে একীকরণ করা হচ্ছে
স্টুয়ার্ট এম

6
যদি সুইফটে কোনও উদ্দেশ্য সি ফ্রেমওয়ার্কটি আমদানি করা হয় তবে ওবিজে সি কাঠামোটি আপনার প্রকল্পের উপর নির্ভর করে এমন সমস্ত ফ্রেমওয়ার্ক আমদানি করে তা নিশ্চিত করুন (নির্মাণের পর্যায়ে -> লাইব্রেরির সাথে বাইনারি লিঙ্ক করুন), তারপরে একটি প্রিফিক্স শিরোলেখ ফাইলটিতে # আমদানি যুক্ত করুন যা বিল্ড সেটিংসে (প্রিফিক্স শিরোলেখের ক্ষেত্রে) আপনার প্রকল্পে অবশ্যই যুক্ত করা উচিত। এটিতে ইউআইকিট এবং ফাউন্ডেশনের মতো ফ্রেমওয়ার্ক অন্তর্ভুক্ত রয়েছে, এমনকি যদি সেগুলি ইতিমধ্যে সুইফটের মধ্যে থেকে ব্যবহৃত হয়। এটি আমাকে কয়েক ঘন্টা ধরে ছড়িয়ে দিয়েছে, এবং কেউ এই পদক্ষেপগুলি নথিভুক্ত করেছে বলে মনে হয় না।
ব্যবহারকারী 1021430

121

সুইজার উইথ কোকো এবং অবজেক্টিভ-সি ব্যবহারের জন্য অ্যাপলের গাইড দেখুন । এই গাইডটিতে কীভাবে সুইফট এবং তদ্বিপরীত থেকে ওজেক্টিভ-সি এবং সি কোড ব্যবহার করতে হবে এবং কোনও প্রকল্পকে কীভাবে রূপান্তর করতে হবে বা বিদ্যমান প্রকল্পে অবজেক্টিভ-সি / সি এবং সুইফট অংশগুলি কীভাবে মিশ্রিত করতে হবে এবং কীভাবে মিলিত করতে হবে তার জন্য প্রস্তাবনা রয়েছে।

সংকলক স্বয়ংক্রিয়ভাবে সি ফাংশন এবং উদ্দেশ্য-সি পদ্ধতিতে কল করার জন্য সুইফট বাক্য গঠন তৈরি করে। ডকুমেন্টেশনে দেখা গেছে, এই উদ্দেশ্য-সি:

UITableView *myTableView = [[UITableView alloc] initWithFrame:CGRectZero style:UITableViewStyleGrouped];

এই সুইফট কোডে পরিণত হয়:

let myTableView: UITableView = UITableView(frame: CGRectZero, style: .Grouped)

এক্সকোড ফ্লাইতেও এই অনুবাদটি করে - আপনি একটি সুইফ্ট ফাইল সম্পাদনা করার সময় দ্রুত ওপেন ব্যবহার করতে পারেন এবং একটি উদ্দেশ্য-সি শ্রেণীর নাম টাইপ করতে পারেন এবং এটি আপনাকে ক্লাস শিরোলেখের একটি সুইফ্ট-আইফাইড সংস্করণে নিয়ে যাবে। (আপনি এটি একটি সুইফ্ট ফাইলে একটি এপিআই চিহ্নে সিএমডি -ক্লিক করেও পেতে পারেন)) এবং আইওএস 8 এবং ওএস এক্স ভি 10.10 (যোসমেট) বিকাশকারী লাইব্রেরিতে সমস্ত এপিআই রেফারেন্স ডকুমেন্টেশন ওজেক্টিভ -সি এবং সুইফট উভয়তেই দৃশ্যমান is রূপগুলি (যেমন UIView)।


3
বিদ্যমান প্রকল্পে কীভাবে সুইফটকে একীভূত করতে হবে অ্যাপলের ডকুমেন্টেশনের সরাসরি লিঙ্ক : বিকাশকারী.অ্যাপল.
com

আমরা যদি আপনার কেন আগ্রহী যে শিরোনামের ফাইলগুলির প্রয়োজন হয় এবং এটি লিঙ্কিংয়ের পর্যায়ে কীভাবে ব্যবহৃত হয় তবে আপনি অবশ্যই এই ম্যানুয়াল সুইফটটি
মধু

62

সুইফট প্রকল্পে অবজেক্টিভ সি কোড ব্যবহারের জন্য এখানে ধাপে ধাপে নির্দেশাবলী দেওয়া হয়েছে (এক্ষেত্রে তৃতীয় পক্ষের দেওয়া ফ্রেমওয়ার্ক)

  1. ফাইল -> নতুন -> নতুন ফাইল -> উদ্দেশ্য-সি ফাইল নির্বাচন করে আপনার সুইফট প্রকল্পে যে কোনও উদ্দেশ্য -সি ফাইল যুক্ত করুন। সংরক্ষণ করার পরে, এক্সকোড জিজ্ঞাসা করবে আপনি ব্রিজিং শিরোনাম যুক্ত করতে চান কিনা । ' হ্যাঁ ' বেছে নিন । (উত্স: derrrick.com )জিআইএফ: প্রকল্পে খালি ফাইল যুক্ত করা এবং ব্রিজিং শিরোনাম উত্পাদন করা

সাধারণ পদক্ষেপে:

  1. একটি প্রম্পট উপস্থিত হবে এবং তারপরে ওকে ক্লিক করুন ... যদি এটি উপস্থিত না হয়, তবে আমরা নীচের মতো এটি নিজেই তৈরি করি ... আইওএস উত্স থেকে একটি শিরোনাম ফাইল তৈরি করুন এবং প্রজেক্টনাম-ব্রিজিং-শিরোনাম নাম দিন (উদাহরণ: পরীক্ষা -ব্রীজিং-শিরোনাম) এবং তারপরে সুইফ্ট সংকলক কোডে সেটিং তৈরি করতে যান -> উদ্দেশ্য-সি ব্রিজটি উদ্দেশ্য-সি ব্রিজের নাম যুক্ত করুন (পরীক্ষা / পরীক্ষা-ব্রিজিং-শিরোনাম।)। হ্যাঁ, এটি সম্পূর্ণ।

  2. Allyচ্ছিকভাবে, ওপেনটিভ-সি ফাইলটি আপনি জুড়েছেন (উপরের জিআইএফ চিত্রটিতে "কিছু" নাম দেওয়া হয়েছে) মুছুন। আপনার আর দরকার নেই।

  3. ব্রিজিং শিরোলেখ ফাইলটি খুলুন - ফাইলের নামটি [আপনার প্রজেক্ট] -ব্রীজিং-শিরোনামH ফর্মের । এটিতে একটি এক্সকোড-সরবরাহিত মন্তব্য অন্তর্ভুক্ত। তৃতীয় পক্ষের কাঠামোর মতো আপনি অন্তর্ভুক্ত করতে চাইলে অবজেক্টিভ-সি ফাইলের জন্য কোডের একটি লাইন যুক্ত করুন । উদাহরণস্বরূপ, আপনার প্রকল্পে মিক্সপ্যানেল যুক্ত করতে, আপনাকে ব্রিজিং হেডার ফাইলে নিম্নলিখিত কোডের লাইন যুক্ত করতে হবে:

    # মিম্পোর্ট
  4. এখন যে কোনও সুইফ্ট ফাইলে আপনি বিদ্যমান অবজেক্টিভ সি কোড ব্যবহার করতে পারেন, সুইফট সিনট্যাক্সে (এই উদাহরণের ক্ষেত্রে, এবং আপনি মিক্সপ্যানেল এসডিকে পদ্ধতিগুলি কল করতে পারেন)। এক্সকোড কীভাবে উদ্দেশ্য-সিটিকে সুইফটে অনুবাদ করে তা আপনাকে নিজের সাথে পরিচিত করতে হবে। অ্যাপলের গাইডটি দ্রুত পঠনযোগ্য। অথবা অসম্পূর্ণ সংক্ষিপ্তসার জন্য এই উত্তরটি দেখুন।

মিক্সপ্যানেলের উদাহরণ:

func application(application: UIApplication, didFinishLaunchingWithOptions launchOptions: [NSObject: AnyObject]?) -> Bool {
    Mixpanel.sharedInstanceWithToken("your-token")
    return true
}

এটাই!

দ্রষ্টব্য: আপনি যদি আপনার প্রকল্প থেকে ব্রিজিং শিরোলেখ ফাইলটি সরিয়ে থাকেন তবে বিল্ড সেটিংসে যান এবং "সুইফ্ট কম্পাইলার - কোড জেনারেশন" এর অধীনে " উদ্দেশ্য-সি ব্রিজিং শিরোনাম " এর মানটি সরিয়ে ফেলার বিষয়ে নিশ্চিত হন ।


39

আপনি সুন্দর পোস্ট সুইফট এবং কোকোপডগুলি পড়তে পারেন । মূলত, আমাদের একটি ব্রিজিং শিরোলেখ ফাইল তৈরি করতে হবে এবং সমস্ত উদ্দেশ্য-সি শিরোনাম সেখানে রাখা উচিত there এবং তারপরে আমাদের এটিকে আমাদের বিল্ড সেটিংস থেকে উল্লেখ করতে হবে। এর পরে, আমরা উদ্দেশ্য-সি কোডটি ব্যবহার করতে পারি।

let manager = AFHTTPRequestOperationManager()
manager.GET(
  "http://example.com/resources.json",
  parameters: nil,
  success: { (operation: AFHTTPRequestOperation!,
              responseObject: AnyObject!) in
      println("JSON: " + responseObject.description)
  },
  failure: { (operation: AFHTTPRequestOperation!,
              error: NSError!) in
      println("Error: " + error.localizedDescription)
  })

পাশাপাশি অ্যাপল এর নথিটি দেখুন যা সুইচ উইথ কোকো এবং অবজেক্টিভ-সি ব্যবহার করে


25

আমি একটি সাধারণ এক্সকোড 6 প্রকল্প লিখেছিলাম যা দেখায় কীভাবে সি ++, উদ্দেশ্য-সি এবং সুইফট কোডটি মিশ্রিত করতে হবে:

https://github.com/romitagl/shared/tree/master/C-ObjC-Swift/Performance_Console

বিশেষত, উদাহরণটি একটি উদ্দেশ্য-সি এবং সুইফট থেকে একটি সি ++ ফাংশন বলে

কীটি হ'ল একটি ভাগ করা শিরোনাম, প্রজেক্ট-ব্রিজিং-শিরোলেখ তৈরি করুন এবং সেখানে উদ্দেশ্য-সি শিরোনাম স্থাপন করুন।

প্রকল্পটি সম্পূর্ণ উদাহরণ হিসাবে ডাউনলোড করুন।


24

আমি এখানে আরও একটি জিনিস যুক্ত করতে চাই:

আমি @ লোগানের উত্তরের জন্য খুব কৃতজ্ঞ এটি ব্রিজ ফাইল এবং সেটআপগুলি তৈরি করতে অনেক সহায়তা করে।

তবে এই সমস্ত পদক্ষেপগুলি করার পরেও আমি সুইফটে একটি উদ্দেশ্য-সি ক্লাস পাচ্ছি না।

আমি cocoapodsগ্রন্থাগারটি ব্যবহার করেছি এবং এটি আমার প্রকল্পে সংহত করেছি। যা হয় pod "pop"

সুতরাং আপনি যদি সুইফটে অবজেক্টিভ-সি পোড ব্যবহার করছেন তবে এমন একটি সুযোগ থাকতে পারে যা আপনি পেতে সক্ষম নন বা import সুইফটে ক্লাস ।

আপনার যা করতে হবে তা হ'ল:

  1. যাও <YOUR-PROJECT>-Bridging-Headerফাইল এবং
  2. বিবৃতি প্রতিস্থাপন #import <ObjC_Framework>করতে@import ObjC_Framework

উদাহরণস্বরূপ: (পপ লাইব্রেরি)

প্রতিস্থাপন করা

#import <pop/POP.h>

সঙ্গে

@import pop;

clang importযখন #importকাজ করছে না তখন ব্যবহার করুন ।


# ইম্পোর্ট কাজ না করা অবস্থায় ক্ল্যাং আমদানি ব্যবহার করুন। কি? শুধু কি বলেন নি যে আমাদের @ ইম্পোর্ট ব্যবহার করা উচিত ?!
মধু

22

ডকুমেন্টেশন থেকে উদ্ধৃতি :

মডিউল হিসাবে অ্যাক্সেসযোগ্য যে কোনও উদ্দেশ্য-সি কাঠামো (বা সি লাইব্রেরি) সরাসরি সুইফটে আমদানি করা যায়। এটিতে অবজেক্টিভ-সি সিস্টেমের ফ্রেমওয়ার্কগুলি যেমন- ফাউন্ডেশন, ইউআইকিট এবং স্প্রিটকিট — পাশাপাশি সিস্টেমের সাথে সরবরাহ করা সাধারণ সি লাইব্রেরি অন্তর্ভুক্ত রয়েছে। উদাহরণস্বরূপ, ফাউন্ডেশন আমদানি করতে, আপনি যে সুইফট ফাইলটিতে কাজ করছেন তার উপরে এই আমদানি বিবৃতিটি কেবল যুক্ত করুন:

import Foundation

এই আমদানিটি NSDate, NSURL, NSMutableData এবং তাদের সমস্ত পদ্ধতি, বৈশিষ্ট্য এবং বিভাগগুলি সহ সমস্ত ফাউন্ডেশন এপিআইগুলিকে সুইফটে সরাসরি উপলভ্য করে তোলে।


12

শুধু যে কেহ সুইফট একটি উদ্দেশ্য সি গ্রন্থাগার যোগ করার জন্য চেষ্টা করছে একটি নোট: আপনি যোগ করা উচিত -ObjC মধ্যে সেটিং বিল্ড -> লিঙ্ক -> অন্যান্য Linker পতাকা


কেন? এই পতাকাটি কী করে এবং কেন এটি যুক্ত করা উচিত সে সম্পর্কে দয়া করে তথ্য যুক্ত করুন।
জোহান কার্লসন

9

আপনি একটি ব্রিজিং শিরোলেখ তৈরি করার পরে, বিল্ড সেটিং => "উদ্দেশ্য-সি ব্রিজিং শিরোলেখ" অনুসন্ধান করুন।

ঠিক নীচে আপনি "" উদ্দেশ্য-সি উত্পন্ন ইন্টারফেস শিরোনামের নাম "ফাইলটি পাবেন।

আপনার ভিউ কন্ট্রোলারে সেই ফাইলটি আমদানি করুন।

উদাহরণ: আমার ক্ষেত্রে: "ডাবল-সুইফট এইচ"

ইটার চিত্রের বিবরণ এখানে


5

নতুন ক্লিক করুন ফাইল মেনুতে , এবং ফাইল নির্বাচন ভাষা উদ্দেশ্য নির্বাচন করুন। সেই সময় এটি স্বয়ংক্রিয়ভাবে একটি "উদ্দেশ্য-সি সেতু শিরোনাম" ফাইল উত্পন্ন করে যা কিছু শ্রেণীর নাম সংজ্ঞায়িত করতে ব্যবহৃত হয়।

"সুইফ্ট সংকলক - কোড উত্পন্নকরণ" এর অধীনে "উদ্দেশ্য-সি ব্রিজিং শিরোলেখ"।


3
  1. নিউফাইলে -> উত্স -> শিরোনাম ফাইল থেকে একটি .h ফাইল তৈরি করুন
  2. তারপরে আপনার ফাইলের নামটি সংরক্ষণ করুন আপনার_টারাজেট_নাম-ব্রিজিং-শিরোনাম। এখানকার লোকেরা তাদের প্রকল্পের নাম গ্রহণ করে সাধারণ ভুল পায় তবে উভয়ই যদি আলাদা হয় তবে সাধারণত প্রকল্পের লক্ষ্যমাত্রার নাম হওয়া উচিত।
  3. তারপরে বিল্ড সেটিংসে অবজেক্টিভ-সি ব্রিজিং শিরোলেখ অনুসন্ধান করুন পতাকাটি অনুসন্ধান করুন এবং আপনার সদ্য নির্মিত ব্রিজিং ফাইলের ঠিকানা রাখুন, আপনি ফাইলটিতে ডান ক্লিক করতে পারেন -> ফাইন্ডারে দেখান -> পাঠ্য অঞ্চলে ফাইলটি টানুন তারপরে ঠিকানাটি হবে জনবহুল হতে।
  4. আপনার ইম্পোর্টটি অবজেক্টিভ-সি_ফাইলে
  5. সুইফ্ট ফাইলে আপনি ওবিজেসি ফাইলটি অ্যাক্সেস করতে পারবেন তবে কেবল সুইফট ভাষায়।

3

এখানে চিত্র বর্ণনা লিখুনআমি গিথুবে এই প্রকল্পটি যুক্ত করেছি যাতে দ্রুত গতিতে কোডটি কল করার জন্য ছোট নমুনা অন্তর্ভুক্ত থাকে।

সুইফট থেকে অবজেক্টিভ ক্লাসে কল করুন


দ্রষ্টব্য: - আপনি যখন এক্সকোড থেকে স্বয়ংক্রিয়ভাবে ক্লাসটি ব্রিজ করার চেয়ে সুইফ্ট প্রকল্পে একটি ওবিজেসি ক্লাস তৈরি করেন। কোনও উদ্বেগ নেই :)
CrazyPro007

3

এক্সকোড 10.1-এ সুইচ 4.2.1 প্রকল্পে আপনি সহজেই উদ্দেশ্য-সি ফাইল যুক্ত করতে পারেন। সুইফট প্রকল্পে অবজেক্টিভ-সি ফাইল ব্রিজ করতে নীচের পদক্ষেপগুলি অনুসরণ করুন।

পদক্ষেপ_01: সুইফট ভাষা ব্যবহার করে নতুন এক্সকোড প্রকল্প তৈরি করুন:

File> New> Project> objc

পদক্ষেপ_02: সুইফ্ট প্রকল্পে নতুন উদ্দেশ্য-সি ফাইল যুক্ত করুন:

File> New> File...> macOS> Objective-C File

পদক্ষেপ_03: আপনি যদি প্রথমবারে সুইফট প্রকল্পে একটি নতুন উদ্দেশ্য-সি ফাইল যুক্ত করেন তবে এক্সকোড আপনাকে জিজ্ঞাসা করবে:

Would you like to configure an Objective-C bridging header?

এখানে চিত্র বর্ণনা লিখুন

পদক্ষেপ_04: বিকল্পটি নির্বাচন করুন:

Create Bridging Header

পদক্ষেপ_05: একটি নামের সাথে একটি সম্পর্কিত ফাইল উত্পন্ন করা হবে:

Objc-Bridging-Header.h

এখানে চিত্র বর্ণনা লিখুন

পদক্ষেপ 66: এখন, আপনাকে ব্রিজ শিরোনামে ব্রিজ ফাইলের পথ সেটআপ করতে হবে। প্রকল্প নেভিগেটরে নাম সহ প্রকল্পে ক্লিক করুন objcএবং তারপরে চয়ন করুন:

Build Settings> Objective-C Bridging Header> Objc-Bridging-Header.h

পদক্ষেপ 77: Objc-Bridging-Header.hএকটি ফাইল পাথ তৈরি করতে আপনার সেই বাক্সে টানুন এবং ছেড়ে দিন ।

এখানে চিত্র বর্ণনা লিখুন

পদক্ষেপ_08: আপনার Objc-Bridging-Header.hফাইলটি খুলুন এবং অবজেক্টিভ সি ফাইলটি আমদানি করুন যা আপনি আপনার সুইফ্ট ফাইলটিতে ব্যবহার করতে চান।

#import "SpecialObjcFile.m"

এখানে একটি বিষয়বস্তু SpecialObjcFile.m:

#import <Foundation/Foundation.h>

@interface Person: NSObject {
@public
    bool busy;
}
@property
    bool busy;
@end

পদক্ষেপ_09: এখন আপনার সুইফ্ট ফাইলে আপনি একটি উদ্দেশ্য-সি শ্রেণি ব্যবহার করতে পারেন:

override func viewDidLoad() {
    super.viewDidLoad()
    let myObjcContent = Person()
    print(myObjcContent.busy)
}

এখানে চিত্র বর্ণনা লিখুন এখানে চিত্র বর্ণনা লিখুন


1

লোগানস উত্তরটি সাম্প্রতিকতম ব্যতীত দুর্দান্ত কাজ Swift 5করে যা কিছু সংকলক ত্রুটি দেয়। যারা সুইফট 5 এ কাজ করছেন তাদের জন্য এখানে স্থিরকরণ।

সুইফট 5

import Foundation

class MySwiftObject : NSObject {

    var someProperty: AnyObject = "Some Initializer Val" as AnyObject

    override init() {}

    func someFunction(someArg:AnyObject) -> String {
        let returnVal = "You sent me \(someArg)"
        return returnVal
    }
}

1

সুইফট গ্রাহক, উদ্দেশ্য-সি প্রযোজক

  1. একটি শিরোনাম .hএবং বাস্তবায়ন .mফাইল যুক্ত করুন -
    উদাহরণস্বরূপ কোকো ক্লাস ফাইল (উদ্দেশ্য-সি)MyFileName

  2. ব্রিজিং শিরোনাম কনফিগার করুন
    আপনি যখন দেখেন Would you like to configure an Objective-C bridging header- হ্যাঁ

    • <target_name>-Bridging-Header.h স্বয়ংক্রিয়ভাবে উত্পন্ন করা হবে
    • বিল্ড সেটিংস -> উদ্দেশ্য-সি ব্রিজিং শিরোনাম
  3. গণনার জমকালো অনুষ্ঠান-শিরোলেখ ক্লাস যোগ
    সালে <target_name>-Bridging-Header.hএকটি লাইন যোগ#import "<MyFileName>.h"

পিএস যদি আপনার বিদ্যমান অবজেক্টিভ-সি ফাইলগুলি সুইফ্ট প্রকল্পে যুক্ত Bridging-Header.hকরা উচিত তবে আগেই যুক্ত করুন

উদ্দেশ্য-সি গ্রাহক, সুইফট প্রযোজক

  1. একটি যোগ করুন <MyFileName>.swiftএবং প্রসারিতNSObject

  2. ওবজেসি ক্লাসে সুইফ্ট ফাইলগুলি আমদানি
    করুন #import "<#YourProjectName#>-Swift.h"আপনার উদ্দেশ্য-সি ফাইলটিতে যুক্ত করুন

  3. সর্বজনীন সুইফট কোডটি চিহ্নিত করুন [@objc এবং @objcMeبار]


0

অ্যাপল এই দস্তাবেজে অফিসিয়াল গাইড সরবরাহ করেছে: কীভাবে কল করতে হবে-উদ্দেশ্য-সি-কোড-থেকে-সুইফ্ট

এখানে প্রাসঙ্গিক অংশ:

একই অ্যাপ্লিকেশনের টার্গেটের মধ্যে সুইজট কোডে অবজেক্টিভ-সি ফাইলগুলির একটি সেট আমদানি করতে, আপনি সেই ফাইলগুলিকে সুইফটে প্রকাশ করার জন্য একটি উদ্দেশ্য-সি ব্রিজিং শিরোলেখ ফাইলটিতে নির্ভর করেন । আপনি যখন বিদ্যমান অবজেক্টিভ-সি অ্যাপ্লিকেশনটিতে একটি সুইফট ফাইল বা একটি বিদ্যমান সুইফট অ্যাপ্লিকেশনটিতে একটি উদ্দেশ্য-সি ফাইল যুক্ত করবেন তখন এক্সকোড এই শিরোনামটি তৈরি করার প্রস্তাব দেয়।

আপনি যদি স্বীকার করেন তবে এক্সকোড আপনার তৈরি করা ফাইলের পাশাপাশি ব্রিজিং শিরোলেখ ফাইলটি তৈরি করে এবং আপনার পণ্যের মডিউল নামটি অনুসরণ করে এর নামকরণ করে "-ব্রীজিং-শিরোলেখ।" বিকল্পভাবে, আপনি ফাইল> নতুন> ফাইল> [অপারেটিং সিস্টেম]> উত্স> শিরোনাম ফাইল নির্বাচন করে একটি ব্রিজিং শিরোনাম তৈরি করতে পারেন

আপনার উদ্দেশ্য-সি কোডটি আপনার সুইফট কোডে প্রকাশ করতে ব্রিজিং শিরোনামটি সম্পাদনা করুন:

  1. আপনার অবজেক্টিভ-সি ব্রিজিং শিরোনামে আপনি সুইফটে এক্সপোজ করতে চান এমন প্রতিটি Objective-C শিরোনাম আমদানি করুন
  2. বিল্ড সেটিংসে, সুইফ্ট সংকলক - কোড জেনারেশনে, নিশ্চিত করুন যে উদ্দেশ্য-সি ব্রিজিং শিরোলেখ বিল্ড সেটিংটির ব্রিজিং শিরোলেখ ফাইলটির কোনও পথ রয়েছে। পাথটি আপনার প্রকল্পের সাথে সম্পর্কিত হতে হবে, আপনার সেভের অনুরূপ, যেমন আপনার তথ্য.পল্লিস্ট পাথটি বিল্ড সেটিংসে নির্দিষ্ট করা হয়েছে। বেশিরভাগ ক্ষেত্রে, আপনাকে এই সেটিংটি পরিবর্তন করতে হবে না।

ব্রিজিং শিরোনামে তালিকাভুক্ত যে কোনও পাবলিক অবজেক্টিভ-সি শিরোনাম সুইফ্টের কাছে দৃশ্যমান।


0

উদ্দেশ্য-সি উদ্দেশ্য-সি ব্যবহারের জন্য দ্বিপথের পদ্ধতি

1

  1. এক্সকোড প্রকল্পে ব্রিজ-শিরোলেখ ফাইল তৈরি করুন
  2. ব্রিজ-হেডার ফাইলটিতে .h ফাইল আমদানি করুন
  3. বিল্ড সেটিংসে ব্রিজ-শিরোনামের পথ নির্ধারণ করুন।
  4. প্রকল্প পরিষ্কার করুন

2

  1. প্রকল্পে উদ্দেশ্য-সি ফাইল তৈরি করুন (এটি স্বয়ংক্রিয়ভাবে আপনার জন্য বিল্ড সেটিংসে পথ নির্ধারণ করে)
  2. ব্রিজ-হেডার ফাইলটিতে .h ফাইল আমদানি করুন

ধন্যবাদ এখন যেতে ভাল

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.