objective c - स्विफ्ट से उद्देश्य-सी कोड कैसे कॉल करें




objective-c swift (9)

स्विफ्ट में उद्देश्य-सी कक्षाओं का उपयोग करना

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

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

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

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

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

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

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

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: ओबीजेसी कक्षा में स्विफ्ट फाइल आयात करें

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. CodeCompletion उतना सटीक व्यवहार नहीं कर रहा था जितना मैं चाहता हूं। मेरे सिस्टम पर, "cmd + r" के साथ त्वरित निर्माण चलाने से स्विफ्ट को उद्देश्य-सी कोड और इसके विपरीत कुछ खोजने में मदद मिली।

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

3. स्विफ्ट 2.0 के बाद, @objc उपसर्ग का उपयोग करके उद्देश्य-सी में शुद्ध स्विफ्ट कक्षाओं का उपयोग करना मूल रूप से संभव था, यह अब संभव नहीं है। मूल स्पष्टीकरण के लिए संपादन इतिहास देखें। यदि भविष्य में स्विफ्ट संस्करणों में यह कार्यक्षमता पुन: सक्षम है, तो उत्तर तदनुसार अपडेट किया जाएगा।

ऐप्पल की नई स्विफ्ट भाषा में, ऑब्जेक्टिव-सी कोड कैसे कॉल करता है?

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

तर्क

उद्देश्य-सी एक मंच-स्वतंत्र भाषा है, जबकि स्विफ्ट मंच-निर्भर है। स्विफ्ट में गैर-प्लेटफॉर्म-निर्भर कोड (व्यवसाय तर्क पुस्तकालय) लिखना इस प्रकार बुद्धिमान नहीं होगा। हालांकि, इसमें मंच-निर्भर कोड लिखना (उदाहरण के लिए इंटरफेस) पूरी तरह से ठीक होगा। यह नहीं कहना कि यह एक अच्छा विचार होगा, हालांकि यह निश्चित रूप से एक ब्याज है।


एक और चीज मैं यहां जोड़ना चाहूंगा:

मैं @ लोगान के उत्तर का बहुत आभारी हूं। यह पुल फ़ाइल और सेटअप बनाने के लिए बहुत मदद करता है।

लेकिन इन सभी चरणों को करने के बाद भी मुझे स्विफ्ट में ऑब्जेक्टिव-सी क्लास नहीं मिल रहा है।

मैंने cocoapods लाइब्रेरी का इस्तेमाल किया और इसे मेरे प्रोजेक्ट में एकीकृत किया। जो pod "pop"

तो अगर स्विफ्ट में ऑब्जेक्टिव-सी फोड का उपयोग कर रहे हैं तो एक मौका हो सकता है कि आप कक्षाओं को स्विफ्ट में प्राप्त या import करने में सक्षम नहीं हो सकते हैं।

आपको जो सरल काम करना है वह है:

  1. <YOUR-PROJECT>-Bridging-Header फ़ाइल पर जाएं और
  2. स्टेटमेंट #import <ObjC_Framework> को @import ObjC_Framework

उदाहरण के लिए: (पॉप लाइब्रेरी)

बदलने के

#import <pop/POP.h>

साथ में

@import pop;

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

कोको और ऑब्जेक्टिव-सी के साथ स्विफ्ट का उपयोग करके ऐप्पल के दस्तावेज़ पर भी एक नज़र डालें।


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

  1. फ़ाइल -> नई -> नई फ़ाइल -> उद्देश्य-सी फ़ाइल चुनकर अपनी स्विफ्ट प्रोजेक्ट में कोई उद्देश्य-सी फ़ाइल जोड़ें । सहेजने पर, एक्सकोड पूछेगा कि क्या आप ब्रिजिंग हेडर जोड़ना चाहते हैं । ' हां ' चुनें। GIF: प्रोजेक्ट में रिक्त फ़ाइल जोड़ना और ब्रिजिंग हेडर उत्पन्न करना http://www.derrrick.com//1-empty-file.gif

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

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

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

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

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

Mixpanel के लिए उदाहरण:

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

बस!

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


ब्रिजिंग हेडर बनाने के बाद, बिल्डिंग सेटिंग => ऑब्जेक्टिव-सी ब्रिजिंग हेडर "के लिए खोजें पर जाएं।

बस नीचे आप उद्देश्य-सी जेनरेटेड इंटरफ़ेस हैडर नाम "फ़ाइल पाएंगे।

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

उदाहरण: मेरे मामले में: "Dauble-Swift.h"


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

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

विशेष रूप से, उदाहरण स्विफ्ट से ऑब्जेक्टिव-सी और सी ++ फ़ंक्शन को कॉल करता है

कुंजी साझा हेडर, प्रोजेक्ट-ब्रिजिंग-हेडर एचएच बनाना है, और ऑब्जेक्टिव-सी हेडर को वहां रखना है।

परियोजना को एक पूर्ण उदाहरण के रूप में डाउनलोड करें।


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

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

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

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

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

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


दस्तावेज़ीकरण से उद्धरण:

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

import Foundation

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


उद्देश्य-सी उद्देश्य-सी का उपयोग करने के लिए दो तरह दृष्टिकोण

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