मैं स्विफ्ट से ऑब्जेक्टिव-सी कोड कैसे कह सकता हूं?


974

स्विफ्ट में, कोई व्यक्ति ऑब्जेक्टिव-सी कोड कैसे कहता है?

ऐप्पल ने उल्लेख किया कि वे एक आवेदन में सह-अस्तित्व में हो सकते हैं, लेकिन क्या इसका मतलब यह है कि कोई तकनीकी रूप से स्विफ्ट में नई कक्षाएं बनाने के दौरान उद्देश्य-सी में बनाई गई पुरानी कक्षाओं का फिर से उपयोग कर सकता है?




10
दिलचस्प है कि इस सवाल को बहुत सारे उत्थान और एक इनाम मिलता है। जब मैंने पहली बार इसे देखा तो मैंने सोचा: आरटीएफएम। जैसा कि पता चला है कि यह वास्तव में कोई शोध नहीं दिखाती है क्योंकि वर्तमान में केवल दो या तीन संसाधन हैं जो आधिकारिक तौर पर स्विफ्ट को दस्तावेज करते हैं, और उनमें से एक पूरी तरह से यह करने के लिए समर्पित है (और पहली टिप्पणी में जुड़ा हुआ है)।
एनालॉग फाइल

6
@ ईवोलगेट: वास्तव में क्या ऑब्जेक्ट सी से गायब है जो इसे एक प्लेटफ़ॉर्म स्वतंत्र भाषा होने से रोकता है? भाषा और भाषा मानक पुस्तकालय खुले स्रोत हैं। आप उद्देश्य सी का उपयोग विंडोज, ओएस एक्स, लिनक्स, बीएसडी, सोलारिस और जीसीसी या एलएलवीएम द्वारा समर्थित किसी भी अन्य प्लेटफॉर्म के लिए कर सकते हैं। आप किसी भी सी के साथ किसी भी प्लेटफॉर्म पर आसानी से ऑब्जेक्टिव सी पोर्ट कर सकते हैं, भले ही यह जीसीसी या एलएलवीएम द्वारा समर्थित न हो। मैं यह नहीं देखता कि इससे अधिक प्लेटफ़ॉर्म स्वतंत्र कैसे हो सकता है।
एनालॉग फाइल

2
@DavidMulder: क्या "रीज़निंग" अनुभाग अभी भी आवश्यक है?
फ्रेंक

जवाबों:


1392

स्विफ्ट में ऑब्जेक्टिव-सी क्लासेस का उपयोग करना

यदि आपके पास एक मौजूदा वर्ग है जिसे आप उपयोग करना चाहते हैं, तो चरण 2 का प्रदर्शन करें और फिर चरण 5 पर जाएं । (कुछ मामलों के लिए, मुझे #import <Foundation/Foundation.hएक पुरानी उद्देश्य-सी फ़ाइल में एक स्पष्ट जोड़ना था ।)

चरण 1: उद्देश्य-सी कार्यान्वयन जोड़ें - .m

.mअपनी कक्षा में एक फ़ाइल जोड़ें , और उसे नाम दें CustomObject.m

चरण 2: ब्रिजिंग हेडर जोड़ें

अपनी .mफ़ाइल जोड़ते समय , आप संभवतः एक प्रॉम्प्ट के साथ हिट होंगे जो इस तरह दिखता है:

Xcode से एक macOS शीट-शैली संवाद पूछ रहा है कि क्या आप "एक उद्देश्य-सी ब्रिजिंग हेडर कॉन्फ़िगर करना चाहेंगे"

हाँ पर क्लिक करें !

यदि आपने प्रॉम्प्ट नहीं देखा है, या गलती से अपने ब्रिजिंग हेडर को हटा दिया है, तो .hअपनी परियोजना में एक नई फ़ाइल जोड़ें और इसे नाम दें <#YourProjectName#>-Bridging-Header.h

कुछ स्थितियों में, विशेष रूप से ऑब्जेक्टिव-सी फ्रेमवर्क के साथ काम करते समय, आप स्पष्ट रूप से ऑब्जेक्टिव-सी क्लास नहीं जोड़ते हैं और Xcode लिंकर को नहीं खोज पाते हैं। इस स्थिति में, अपनी .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"

चरण 6: अपनी वस्तु का उपयोग करें

इन 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स्विफ्ट संदर्भ से कुछ ऑब्जेक्ट-सी कोड खोजने के लिए Xcode की मदद करने के लिए एक त्वरित निर्माण चलाने का प्रयास करें और इसके विपरीत।

  2. यदि आप .swiftकिसी पुराने प्रोजेक्ट में फ़ाइल जोड़ते हैं और त्रुटि प्राप्त करते हैं dyld: Library not loaded: @rpath/libswift_stdlib_core.dylib, तो पूरी तरह से Xcode को पुनरारंभ करने का प्रयास करें ।

  3. जबकि मूल रूप से शुद्ध स्विफ्ट कक्षाओं (वंशजों का नहीं NSObject) का उपयोग करना संभव था जो @objcउपसर्ग का उपयोग करके उद्देश्य-सी के लिए दिखाई देते हैं , यह अब संभव नहीं है। अब, ऑब्जेक्टिव-सी में दिखाई देने के लिए, स्विफ्ट ऑब्जेक्ट या तो एक वर्ग के अनुरूप होना चाहिए NSObjectProtocol(ऐसा करने का सबसे आसान तरीका है NSObject), या कुछ पूर्णांक प्रकार के कच्चे मान के साथ enumचिह्नित होना । आप इन प्रतिबंधों के बिना स्विफ्ट 1.x कोड के उदाहरण के लिए संपादित इतिहास देख सकते हैं।@objcInt@objc


5
यह महत्वपूर्ण है कि आपको @objc के साथ तरीकों की व्याख्या करने की आवश्यकता है या स्विफ्ट विधियां उद्देश्य-सी से दिखाई नहीं देंगी।
टॉम लीन्हर्ट

29
तुम सही हो। यदि आप कोकोआ वस्तुओं का उपयोग नहीं करते हैं, तो आपको इसे निर्दिष्ट करने की आवश्यकता है। ऑब्जेक्टिव-सी में सुलभ और प्रयोग करने योग्य होने के लिए, एक स्विफ्ट क्लास एक ऑब्जेक्टिव-सी क्लास का वंशज होना चाहिए या इसे @objc के रूप में चिह्नित किया जाना चाहिए।
टॉम लीन्हर्ट

2
@MarkusRautopuro - इसे यहां से प्राप्त करें: developer.apple.com/library/prerelease/ios/documentation/Swift/… "
लोगन

2
यह भी देखें: WWDC 2014 सत्र 406: उद्देश्य-सी के साथ स्विफ्ट का एकीकरण
स्टुअर्ट एम

6
यदि स्विफ्ट में एक ऑब्जेक्टिव सी फ्रेमवर्क इम्पोर्ट किया जाता है, तो सुनिश्चित करें कि ओबज सी फ्रेमवर्क आपके प्रोजेक्ट (बिल्ड बिल्ड चरणों में -> लिंक बाइनरी विद लाइब्रेरीज़) में उन सभी फ्रेमवर्क को आयात करना सुनिश्चित करें, फिर # प्रीफ़िक्स हेडर फ़ाइल में उन लोगों के लिए # आयात जोड़ें, जो बिल्ड सेटिंग्स (प्रीफ़िक्स हैडर फ़ील्ड में) को अपनी परियोजना में जोड़ा जाना चाहिए। इसमें UIKit और Foundation जैसे फ्रेमवर्क शामिल हैं, भले ही वे स्विफ्ट के भीतर पहले से ही इस्तेमाल किए गए हों। इसने मुझे घंटों तक परेशान किया, और किसी को भी इन कदमों का दस्तावेज नहीं लगा।
user1021430

121

कोको और ऑब्जेक्टिव-सी के साथ स्विफ्ट का उपयोग करने के लिए ऐप्पल का गाइड देखें । यह मार्गदर्शिका यह बताती है कि स्विफ्ट और इसके विपरीत से ऑब्जेक्टिव-सी और सी कोड का उपयोग कैसे किया जाए और इसमें किसी प्रोजेक्ट को कैसे कन्वर्ट किया जाए या किसी मौजूदा प्रोजेक्ट में ऑब्जेक्टिव-सी / सी और स्विफ्ट पार्ट्स को कैसे मिलाया जाए, इसकी सिफारिशें हैं।

संकलक स्वचालित रूप से C फ़ंक्शन और उद्देश्य-सी विधियों को कॉल करने के लिए स्विफ्ट सिंटैक्स उत्पन्न करता है। जैसा कि प्रलेखन में देखा गया है, यह उद्देश्य-सी:

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

इस स्विफ्ट कोड में बदल जाता है:

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

Xcode इस अनुवाद को फ्लाई पर भी करता है - आप स्विफ्ट फ़ाइल का संपादन करते समय Open Quickly का उपयोग कर सकते हैं और एक Objective-C क्लास नाम टाइप कर सकते हैं, और यह आपको क्लास हेडर के स्विफ्ट-इफाइड संस्करण में ले जाएगा। (आप स्विफ्ट फ़ाइल में API प्रतीक पर cmd-क्लिक करके भी इसे प्राप्त कर सकते हैं।) और iOS 8 और OS X v10.10 (Yosemite) डेवलपर पुस्तकालयों में सभी API संदर्भ दस्तावेज ऑब्जेक्टिव-सी और स्विफ्ट दोनों में दिखाई दे रहे हैं। रूपों (जैसे UIView)।


3
Apple प्रलेखन का सीधा लिंक मौजूदा परियोजना में स्विफ्ट को कैसे एकीकृत किया जाए
Skywinder

यदि हम इस बारे में रुचि रखते हैं कि शीर्ष लेख फ़ाइलों की आवश्यकता क्यों है और लिंकिंग चरण के दौरान इसका उपयोग कैसे किया जाता है, तो सुनिश्चित करें कि आपने इस मैनुअल स्विफ्ट को
हनी

62

यहां एक स्विफ्ट परियोजना में उद्देश्य-सी कोड (इस मामले में, एक तीसरे पक्ष द्वारा प्रदान की गई रूपरेखा) का उपयोग करने के लिए चरण-दर-चरण निर्देश दिए गए हैं:

  1. फ़ाइल -> नई -> नई फ़ाइल -> उद्देश्य-सी फ़ाइल का चयन करके अपने स्विफ्ट प्रोजेक्ट में कोई भी उद्देश्य-सी फ़ाइल जोड़ें । सहेजने पर, Xcode पूछेगा कि क्या आप एक ब्रिजिंग हेडर जोड़ना चाहते हैं । ' हां ' चुनें । (स्रोत: derrrick.com )Gif: प्रोजेक्ट में खाली फ़ाइल जोड़ना और ब्रिजिंग हेडर बनाना

सरल चरणों में:

  1. एक प्रॉम्प्ट दिखाई देता है, और फिर ठीक पर क्लिक करें ... यदि यह प्रकट नहीं होता है, तो हम इसे मैन्युअल रूप से निम्नलिखित में बनाते हैं ... iOS स्रोत से एक हेडर फ़ाइल बनाएं और प्रोजेक्ट का नाम दें-ब्रिजिंग-हेडर (उदाहरण: टेस्ट -ब्रिडिंग-हैडर), और फिर स्विफ्ट कंपाइलर कोड में सेटिंग का निर्माण करने के लिए जाएं -> ऑब्जेक्टिव-सी ब्रिज ऑब्जेक्टिव-सी ब्रिज नाम जोड़ें .. (टेस्ट / टेस्ट-ब्रिजिंग-हैडर.एच)। हाँ, यह पूरा हुआ।

  2. वैकल्पिक रूप से, आपके द्वारा जोड़ी गई ऑब्जेक्टिव-सी फाइल को हटाएं (ऊपर दी गई GIF इमेज में "कुछ भी" नाम दिया गया है)। आपको इसकी कोई आवश्यकता नहीं है।

  3. ब्रिजिंग हेडर फ़ाइल खोलें - फ़ाइल का नाम फॉर्म [YourProject] -Bridging-Header.h है । इसमें एक Xcode प्रदान की गई टिप्पणी शामिल है। ऑब्जेक्ट-सी फ़ाइल के लिए कोड की एक पंक्ति जोड़ें, जिसे आप तीसरे पक्ष के ढांचे के रूप में शामिल करना चाहते हैं । उदाहरण के लिए, अपने प्रोजेक्ट में मिक्सपेन को जोड़ने के लिए, आपको ब्रिजिंग हेडर फ़ाइल में कोड की निम्नलिखित पंक्ति को जोड़ना होगा:

    #import "मिक्सपैन.एच"
  4. अब किसी भी स्विफ्ट फ़ाइल में आप मौजूदा ऑब्जेक्टिव-सी कोड का उपयोग कर सकते हैं, स्विफ्ट सिंटैक्स में (इस उदाहरण के मामले में, और आप मिक्सडेल एसडीके विधियों, आदि को कॉल कर सकते हैं)। आपको खुद को इस बात से परिचित कराना होगा कि कैसे Xcode ऑब्जेक्टिव-सी को स्विफ्ट में ट्रांसलेट करता है। Apple का गाइड एक त्वरित रीड है। या एक अपूर्ण सारांश के लिए इस उत्तर को देखें।

मिक्सपैन का उदाहरण:

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

बस!

नोट: यदि आप अपने प्रोजेक्ट से ब्रिजिंग हेडर फाइल को हटाते हैं, तो "स्विफ्ट कंपाइलर - कोड जनरेशन" के तहत बिल्ड सेटिंग्स में जाएं और " ऑब्जेक्टिव-सी ब्रिजिंग हैडर " के मूल्य को हटा दें ।


39

आप अच्छी पोस्ट Swift & Cocoapods पढ़ सकते हैं । मूल रूप से, हमें एक ब्रिजिंग हेडर फ़ाइल बनाने और सभी ऑब्जेक्टिव-सी हेडर वहाँ लगाने की आवश्यकता है। और फिर हमें अपनी बिल्ड सेटिंग्स से इसे संदर्भित करने की आवश्यकता है। उसके बाद, हम ऑब्जेक्टिव-सी कोड का उपयोग कर सकते हैं।

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

मैंने एक सरल Xcode 6 प्रोजेक्ट लिखा, जिसमें C ++, ऑब्जेक्टिव-सी और स्विफ्ट कोड को मिलाने का तरीका दिखाया गया है:

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काम न हो तब उपयोग करें ।


जब #import काम नहीं कर रहा हो तो क्लैंग आयात का उपयोग करें। क्या? सिर्फ यह नहीं कहा कि हमें @import का उपयोग करना चाहिए?
Honey

22

प्रलेखन से उद्धरण :

किसी भी उद्देश्य-सी ढांचे (या सी लाइब्रेरी) जो एक मॉड्यूल के रूप में सुलभ है, स्विफ्ट में सीधे आयात किया जा सकता है। इसमें सभी ऑब्जेक्टिव-सी सिस्टम फ्रेमवर्क शामिल हैं - जैसे कि फाउंडेशन, यूआईकिट, और स्प्राइटकिट-साथ ही सिस्टम के साथ आपूर्ति की जाने वाली सामान्य सी लाइब्रेरी। उदाहरण के लिए, फ़ाउंडेशन को आयात करने के लिए, आप जिस स्विफ्ट फ़ाइल में काम कर रहे हैं, उसके शीर्ष पर इस आयात स्टेटमेंट को जोड़ें:

import Foundation

यह आयात NSDate, NSURL, NSMutableData, और उनके सभी तरीकों, गुणों और श्रेणियों सहित फाउंडेशन APIs के सभी बनाता है-सीधे स्विफ्ट में उपलब्ध है।


12

स्विफ्ट में ऑब्जेक्टिव-सी लाइब्रेरी जोड़ने के लिए जो कोई भी कोशिश कर रहा है, उसके लिए एक नोट: आपको बिल्ड सेटिंग्स में -ObjC जोड़ना होगा -> लिंकिंग -> अन्य लिंकर फ्लैग्स


क्यों? कृपया यह जानकारी जोड़ें कि यह ध्वज क्या करता है और इसे क्यों जोड़ा जाना चाहिए।
जोहान कार्ल्ससन

9

आपके द्वारा ब्रिजिंग हेडर बनाने के बाद, Build Setting => "Objective-C Bridging Header" पर जाएं।

नीचे आपको "" Objective-C Generated Interface Header Name "'फाइल मिलेगी।

उस फाइल को अपने व्यू कंट्रोलर में इम्पोर्ट करें।

उदाहरण: मेरे मामले में: "डौबल-स्विफ्ट.एच"

eEter चित्र विवरण यहाँ


5

नई फ़ाइल मेनू पर क्लिक करें , और फ़ाइल चुनें भाषा का उद्देश्य। उस समय यह स्वचालित रूप से एक "ऑब्जेक्टिव-सी ब्रिजिंग हैडर" फ़ाइल उत्पन्न करता है जिसका उपयोग कुछ वर्ग नाम को परिभाषित करने के लिए किया जाता है।

"स्विफ्ट कंपाइलर - कोड जेनरेशन" के तहत "ऑब्जेक्टिव-सी ब्रिजिंग हैडर"।


3
  1. NewFile से एक -h फ़ाइल बनाएँ -> स्रोत -> हेडर फ़ाइल
  2. फिर फाइल का नाम Save Your_Target_Name-Bridging-Header.h यहां लोगों को अपना प्रोजेक्ट नाम लेने से आम गलती हो जाती है, लेकिन यह प्रोजेक्ट के टारगेट का नाम होना चाहिए अगर दोनों अलग-अलग हैं, तो आम तौर पर वे समान हैं।
  3. फिर Objective-C Bridging Header फ्लैग की सेटिंग सेटिंग में और अपनी नई बनाई गई ब्रिजिंग फ़ाइल का पता डालें, आप इसे सही फ़ाइल पर क्लिक कर सकते हैं -> फाइंडर में दिखाएं -> फिर टेक्स्ट एरिया में फाइल को ड्रैग करें। आबाद होना।
  4. #Import Your_Objective-C_file.h का उपयोग करना
  5. स्विफ्ट फाइल में आप ओबजेक फाइल को एक्सेस कर सकते हैं लेकिन स्विफ्ट भाषा में।

3

यहां छवि विवरण दर्ज करेंमैंने प्रोजेक्ट को जीथब पर जोड़ा है जिसमें स्विफ्ट से ऑब्जेक्टिव सी कोड को कॉल करने के लिए छोटा नमूना शामिल है।

स्विफ्ट से ऑब्जेक्टिव क्लास को कॉल करें


नोट: - जब आप xcode की तुलना में स्विफ्ट प्रोजेक्ट में एक ओब्जेक्ट क्लास बनाते हैं तो क्लास को स्वचालित रूप से ब्रिज करने के लिए कहता है। कोई चिंता नहीं :)
CrazyPro007

3

Xcode 10.1 में Swift 4.2.1 प्रोजेक्ट में आप आसानी से Objective-C फ़ाइल जोड़ सकते हैं। स्विफ्ट प्रोजेक्ट के लिए Object-C फ़ाइल को ब्रिज करने के लिए नीचे दिए गए चरणों का पालन करें।

Step_01: स्विफ्ट भाषा का उपयोग करके नया Xcode प्रोजेक्ट बनाएं:

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?

यहां छवि विवरण दर्ज करें

Step_04: विकल्प चुनें:

Create Bridging Header

Step_05: एक संबंधित फ़ाइल एक नाम के साथ उत्पन्न होगी:

Objc-Bridging-Header.h

यहां छवि विवरण दर्ज करें

Step_06: अब, आपको ब्रिज हेडर में सेटअप ब्रिज फाइल पथ की आवश्यकता है। प्रोजेक्ट नेविगेटर में नाम के साथ प्रोजेक्ट पर क्लिक करें objcऔर फिर चुनें:

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

Step_07: Objc-Bridging-Header.hफ़ाइल पथ उत्पन्न करने के लिए अपने बॉक्स को उस बॉक्स में खींचें और छोड़ें ।

यहां छवि विवरण दर्ज करें

Step_08: अपनी 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: अब आपकी स्विफ्ट फ़ाइल में, आप एक Object-C क्लास का उपयोग कर सकते हैं:

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. आयात स्विफ्ट फ़ाइलें ObjC क्लास को
    जोड़े #import "<#YourProjectName#>-Swift.h"आपकी ऑब्जेक्टिव-सी फाइल में

  3. सार्वजनिक स्विफ्ट कोड [@objc और @objcMembers] चिह्नित करें


0

Apple ने इस डॉक्टर में आधिकारिक गाइड प्रदान किया है: कैसे-टू-कॉल-उद्देश्य-सी-कोड-से-स्विफ्ट

यहाँ प्रासंगिक हिस्सा है:

एक ही ऐप लक्ष्य के भीतर स्विफ्ट कोड में ऑब्जेक्टिव-सी फ़ाइलों का एक सेट आयात करने के लिए, आप उन फ़ाइलों को स्विफ्ट करने के लिए एक्सपेक्टिव-सी ब्रिजिंग हेडर फ़ाइल पर भरोसा करते हैं । Xcode इस हेडर को तब बनाता है जब आप किसी मौजूदा ऑब्जेक्टिव-सी ऐप में एक स्विफ्ट फाइल जोड़ते हैं, या किसी मौजूदा स्विफ्ट एप में एक ऑब्जेक्टिव-सी फाइल।

यदि आप स्वीकार करते हैं, तो Xcode आपके द्वारा बनाई जा रही फ़ाइल के साथ ब्रिजिंग हेडर फ़ाइल बनाता है, और इसे अपने उत्पाद मॉड्यूल नाम का उपयोग करके "-ब्रिडिंग-हैडर.एच" नाम से बनाता है। वैकल्पिक रूप से, आप फ़ाइल> नई> फ़ाइल> [ऑपरेटिंग सिस्टम]> स्रोत> हेडर फ़ाइल चुनकर स्वयं एक शानदार हेडर बना सकते हैं

अपने उद्देश्य-सी कोड को अपने स्विफ्ट कोड में उजागर करने के लिए ब्रिजिंग हेडर को संपादित करें:

  1. अपने ऑब्जेक्टिव-सी ब्रिजिंग हेडर में, स्विफ्ट के सामने आने वाले हर ऑब्जेक्टिव-सी हेडर को इम्पोर्ट करें
  2. बिल्ड सेटिंग्स में, स्विफ्ट कंपाइलर - कोड जेनरेशन में, सुनिश्चित करें कि ऑब्जेक्टिव-सी ब्रिजिंग हैडर बिल्ड सेटिंग में ब्रिजिंग हेडर फाइल के लिए एक रास्ता है। पथ आपके प्रोजेक्ट के सापेक्ष होना चाहिए, उसी तरह जैसे कि आपकी Info.plist पथ बिल्ड सेटिंग्स में निर्दिष्ट है। ज्यादातर मामलों में, आपको इस सेटिंग को संशोधित करने की आवश्यकता नहीं होगी।

ब्रिजिंग हेडर में सूचीबद्ध कोई भी सार्वजनिक उद्देश्य-सी हेडर स्विफ्ट के लिए दिखाई देते हैं।


0

ऑब्जेक्टिव-सी ऑब्जेक्टिव-सी के इस्तेमाल का दो तरीका

1

  1. Xcode प्रोजेक्ट में ब्रिज-हेडर.ह फ़ाइल बनाएँ
  2. import .h फ़ाइल ब्रिज-हैडर फ़ाइल में
  3. बिल्ड सेटिंग्स में ब्रिज-हैडर का पथ सेट करें।
  4. प्रोजेक्ट को साफ करें

2

  1. प्रोजेक्ट में ऑब्जेक्टिव-सी फाइलें बनाएँ (यह आपके लिए बिल्ड सेटिंग्स में स्वतः ही रास्ता तय करता है)
  2. import .h फ़ाइल ब्रिज-हैडर फ़ाइल में

अब धन्यवाद करने के लिए अच्छा है

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.