objective c - কিভাবে সুইফ্ট থেকে উদ্দেশ্য-সি কোড কল




objective-c swift (10)

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

** যদি আপনার কোন বিদ্যমান শ্রেণী রয়েছে যা আপনি ব্যবহার করতে চান তবে পদক্ষেপ 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

অন্য। CustomObject.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"

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

SomeSwiftFile.swift :

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

স্পষ্টভাবে আমদানি করার কোন প্রয়োজন নেই; যে ব্রিজিং হেডার জন্য কি।

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

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

আপনার প্রকল্পে একটি .swift ফাইল যোগ করুন, এবং এটি MySwiftObject.swift নাম।

MySwiftObject.swift :

import Foundation

class MySwiftObject : NSObject {

    var someProperty: AnyObject = "Some Initializer Val"

    init() {}

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

পদক্ষেপ 2: ObjC ক্লাসে আমদানি সুইফ্ট ফাইল

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 someFunction:@"Arg"];
NSLog(@"RetString: %@", retString);

বিঃদ্রঃ:

1. কোডসম্প্লিশনটি ঠিক যেমনটা আমি চাই তেমন আচরণ করছিলাম না। আমার সিস্টেমে, "cmd + r" দিয়ে দ্রুত বিল্ড চালানোর কাজটি সুইফটকে উদ্দেশ্য-সি কোড এবং এর বিপরীত কিছু খুঁজে পেতে সাহায্য করলো।

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

3. সুইফ্ট 2.0 এর পরে, @objc উপসর্গটি ব্যবহার করে মূলত মূল উদ্দেশ্যটি সি-তে @objc -সি ব্যবহার করা সম্ভব ছিল, এটি আর সম্ভব নয়। মূল ব্যাখ্যা জন্য ইতিহাস সম্পাদনা দেখুন। ভবিষ্যতে সুইফ্ট সংস্করণগুলিতে এই কার্যকারিতা পুনরায় সক্ষম করা হলে, উত্তরটি সেই অনুযায়ী আপডেট করা হবে।

অ্যাপল থেকে নতুন সুইফ্ট ভাষাতে, কীভাবে উদ্দেশ্য-সি কোডটি কল করে?

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

যুক্তি

উদ্দেশ্য-সি একটি প্ল্যাটফর্ম-স্বাধীন ভাষা, যেখানে সুইফ্ট প্ল্যাটফর্ম নির্ভর। সুইফ্টে নন-প্ল্যাটফর্ম-নির্ভরশীল কোড (ব্যবসায় লজিক লাইব্রেরি) লেখা, তাই বিজ্ঞ হবে না। যাইহোক, এটিতে প্ল্যাটফর্ম-নির্ভর কোড লেখা (উদাহরণস্বরূপ ইন্টারফেস) পুরোপুরি জরিমানা হবে। এটি একটি ভাল ধারণা হবে না, তবে এটা স্পষ্টভাবে একটি সুদ।


এখানে আরো যোগ করতে চাই

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

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

আমি cocoapods লাইব্রেরি ব্যবহার এবং আমার প্রকল্পের মধ্যে এটি সংহত। যা pod "pop"

তাই আপনি সুইফ্টে উদ্দেশ্য-সি পড ব্যবহার করছেন তবে আপনি সুইফ্টে ক্লাসগুলি পেতে বা import করতে পারবেন না এমন একটি সুযোগ হতে পারে।

আপনাকে যা করতে হবে তা সহজ জিনিস:

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

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

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

#import <pop/POP.h>

সঙ্গে

@import pop;

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


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

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)
  })

পাশাপাশি কোকো এবং উদ্দেশ্য-সি সহ সুইফ্ট ব্যবহার করে অ্যাপল এর দস্তাবেজেও নজর রাখুন।


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

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

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

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

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


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


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

  1. ফাইল -> নতুন -> নতুন ফাইল -> উদ্দেশ্য-সি ফাইল নির্বাচন করে আপনার সুইফ্ট প্রকল্পে কোন উদ্দেশ্য-সি ফাইল যোগ করুন । সংরক্ষণ করার পরে, যদি আপনি একটি ব্রিজিং হেডার যোগ করতে চান তাহলে Xcode জিজ্ঞাসা করবে । ' হ্যাঁ ' নির্বাচন করুন। GIF: প্রজেক্টের জন্য খালি ফাইল যোগ করা এবং ব্রিজিং হেডার তৈরি করা http://www.derrrick.com//1-empty-file.gif

সহজ ধাপে:

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

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

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

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

Mixpanel জন্য উদাহরণ:

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

এটাই!

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


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

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

import Foundation

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



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

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

File > New > Project > objc

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

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

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

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

ধাপ -14: বিকল্পটি নির্বাচন করুন:

Create Bridging Header

পদক্ষেপ -15: একটি সংশ্লিষ্ট ফাইল একটি নাম দিয়ে তৈরি করা হবে:

Objc-Bridging-Header.h

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

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

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

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

#import "SpecialObjcFile.m"

এখানে SpecialObjcFile.m এর একটি সামগ্রী রয়েছে:

#import <Foundation/Foundation.h>

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

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

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


উদ্দেশ্য-সি উদ্দেশ্য-সি ব্যবহার করার দুটি উপায় পদ্ধতি-সি

1

1. Create bridge-header.h file in Xcode Project
2. import .h file in bridge-Header file
3. Set path of bridge-Header in Build settings. 
3. Clean the Project 

2

  1. Create objective-c files in project(it automatically set path in Build Settings for you )
  2. import .h file in bridge-Header file

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





swift