मैं उद्देश्य-सी में स्विफ्ट कोड कैसे आयात कर सकता हूं?


281

मैंने स्विफ्ट में एक पुस्तकालय लिखा है और मैं इसे अपने वर्तमान प्रोजेक्ट में आयात करने में सक्षम नहीं था, जो कि ऑब्जेक्टिव-सी में लिखा गया है।

क्या इसे आयात करने के कोई तरीके हैं?

#import "SCLAlertView.swift" - 'SCLAlertView.swift' file not found

9
इस परियोजना को प्यार करो!
SleepsOnNewspapers

जवाबों:


430

आपको आयात करने की आवश्यकता है TargetName-Swift.h। ध्यान दें कि यह लक्षित नाम है - अन्य उत्तर वर्ग नाम का उपयोग करने की गलती करते हैं।

यह एकल फ़ाइल एक ऑटोजेनरेटेड हेडर है जो आपके प्रोजेक्ट के सभी स्विफ्ट वर्गों के लिए ऑब्जेक्टिव-सी इंटरफेस को परिभाषित करता है जो या तो एनोटेट से @objcया इनहेरिट से किया गया है NSObject

बातें:

  • यदि आपके लक्षित नाम में रिक्त स्थान हैं, तो उन्हें अंडरस्कोर से बदलें (जैसे My Projectबन जाता है My_Project-Swift.h)

  • यदि आपका लक्ष्य एक रूपरेखा है, तो आपको आयात करने की आवश्यकता है <TargetName/TargetName-Swift.h>

  • सुनिश्चित करें कि आपकी स्विफ्ट फ़ाइल लक्ष्य का सदस्य है


5
ध्यान दें कि यदि आप अपने आयात में स्विफ्ट फ़ाइल नाम का उपयोग करने का प्रयास करते हैं, तो आपको "अपेक्षित ';' शीर्ष स्तर के घोषणाकर्ता के बाद ”। "आयात फाउंडेशन" के बाद अपनी स्विफ्ट फ़ाइल में।
लूइलॉई

8
संपादित करें: ध्यान दें: काम करने के लिए, एक परियोजना मॉड्यूल नाम को परिभाषित किया जाना चाहिए। देखें: stackoverflow.com/a/24064015/2085743
रुबेन मार्टिनेज जूनियर।

7
मैं सिर्फ एक नोट जोड़ना चाहूंगा कि यदि आपके प्रोजेक्ट के नाम में कोई सफेद जगह या विशेष चरित्र है, तो आपको उन्हें अंडरस्कोर से बदलना होगा, जैसे "माई ऐप" "My_App-Swift.h" होगा
होला

84
यह इतना कठिन और खराब दस्तावेज क्यों है?
uchuugaka

3
@lelelo नहीं, वह फ़ाइल इस एक के विपरीत है। ब्रिजिंग हेडर डेवलपर द्वारा लिखा गया है और आपको अपने स्विफ्ट कोड में ऑब्जेक्टिव-सी और सी प्रतीकों को लाने देता है। लक्ष्य-स्विफ्ट.ह फ़ाइल स्वचालित रूप से उत्पन्न होती है और आपके उद्देश्य-सी / सी कोड को स्विफ्ट प्रतीकों तक पहुंच देती है।
बिल

154

Apple वेबसाइट से निर्देश:

एक ही ढांचे से उद्देश्य-सी में स्विफ्ट कोड आयात करने के लिए

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

#import "ProductName-Swift.h"

संशोधन:

आप केवल "ProductName-Swift.h" को .m फ़ाइलों में आयात कर सकते हैं ।

आपके लक्ष्य में मौजूद स्विफ्ट फाइलें इस आयात विवरण वाली ऑब्जेक्टिव-सी .m फाइलों में दिखाई देंगी।

चक्रीय संदर्भों से बचने के लिए, स्विफ्ट को एक उद्देश्य-सी हेडर फ़ाइल में आयात न करें। इसके बजाय, आप इसे एक उद्देश्य-सी हेडर में उपयोग करने के लिए एक स्विफ्ट वर्ग की घोषणा कर सकते हैं। ध्यान दें कि आप उद्देश्य-सी में एक स्विफ्ट वर्ग को उप-वर्ग नहीं कर सकते हैं।

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


2
केवल "ProductName-Swift.h" .m फ़ाइलों को आयात करने से मुझे मदद मिली। .Pch फ़ाइल में समान जोड़ने से "CLLocationManagerDelegate के लिए प्रोटोकॉल घोषणा नहीं मिल रही है" क्या आपका मतलब 'NSLayoutManagerDelegate' था? "
अल्फोंस आर। डिसूजा

@ यह सीधे नहीं है, प्रलेखन का कहना है कि। सबसे आसान तरीका एक उद्देश्य-सी वर्ग बनाना है जो एक ऐसे प्रारूप में अनुवाद करता है जिसे उद्देश्य-सी ++ समझता है। डेवलपर
एलेजांद्रो इवान

1
ध्यान दें कि आपको प्राप्त करना है NSObject!!! आप बस एक class Blah तेजी से घोषणा कर सकते हैं और यह काम नहीं कर सकता। यह करने की आवश्यकता हैclass Blah : NSObject
डेविड टी।

कुछ मामलों के लिए इस उत्तर को पढ़ते हुए: stackoverflow.com/questions/26328034/… आप क्या कर रहे हैं इसके आधार पर: #import <ProductName / ProductModuleName-Swift.h> #import <ProductModuleName-Swift.h> #import <NewTestApp / NewTestApp -Swift.h>
inigo333

यदि आप स्विफ्ट एक्सटेंशन का आयात करना चाहते हैं तो क्या होगा?
रिकार्डो

150

यहाँ क्या करना है:

  1. ऑब्जेक्टिव-सी में एक नया प्रोजेक्ट बनाएं

  2. एक नई .swiftफ़ाइल   बनाएँ

    • एक पॉपअप विंडो दिखाई देगी और पूछेंगी "क्या आप ऑब्जेक्टिव-सी ब्रिजिंग हैडर को कॉन्फ़िगर करना चाहेंगे"
    • हाँ चुनें ।
  3. अपनी Xcode प्रोजेक्ट फ़ाइल पर क्लिक करें

  4. बिल्ड सेटिंग्स पर क्लिक करें

  5. खोजें सर्च बार के लिए खोज और परिभाषित करता है मॉड्यूल

  6. मान को हां में बदलें ।

  7. उत्पाद मॉड्यूल का नाम खोजें ।

  8. मूल्य को अपनी परियोजना के नाम में बदलें।

  9. अनुप्रयोग प्रतिनिधि में, निम्नलिखित जोड़ें: #import "YourProjectName-Swift.h"


नोट: जब भी आप अपनी स्विफ्ट फ़ाइल का उपयोग करना चाहते हैं तो आपको निम्नलिखित लाइन का आयात करना चाहिए:

#import "YourProjectName-Swift.h"


1
के मान में बदलाव करने Defines moduleमें Build settingsकरने के लिए Yesक्या मेरे लिए चीजें तय है!
जकारिया ब्रेक्सा

एंबेडेड कंटेंट में स्विफ्ट शामिल है: हाँ यह भी उपयोग करें
मोहित

4
अच्छा जवाब है, लेकिन कदम 7-8 की जरूरत नहीं है Xcode 7.3.1 और उच्चतर
सैम बी

मेरे लिए काम किया! धन्यवाद।
इसकी आयुध

1
बस ऐसे ही जोड़ना चाहते हैं YourProjectNameमें #import "YourProjectName-Swift.h"कदम 8. उपयोगी से परियोजना का नाम होगा यदि अपने प्रोजेक्ट के नाम विशेष वर्ण हैं और आप सुनिश्चित कैसे वास्तव में आप स्वरूपित करना चाहिए नहीं कर रहे हैं।
चक बोरिस

40

यदि आप Cocoapods का उपयोग कर रहे हैं और एक ObjC परियोजना में एक स्विफ्ट पॉड का उपयोग करने की कोशिश कर रहे हैं, तो आप निम्नलिखित कार्य कर सकते हैं:

@import <FrameworkName>;

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


1
आपका बहुत बहुत धन्यवाद! आपने मेरा दिन बचाया।
एशा

यह एक आकर्षण की तरह काम करता है अगर हम कोकोपोड्स के माध्यम से स्विफ्ट-निर्मित पुस्तकालय स्थापित करते हैं। अपवित्र !!!
NSPratik

21

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

यदि आपकी "उत्पाद मॉड्यूल नाम" संपत्ति (उपरोक्त संपत्ति जो डिफ़ॉल्ट रूप से निर्भर करती है) अलग-अलग होती है, तो यह इस बात पर निर्भर करता है कि आप परीक्षण / डिबग / रिलीज / आदि के लिए संकलन करते हैं (जैसे कि यह मेरे मामले में है), फिर इस संपत्ति को स्वतंत्र करें कस्टम नाम सेट करके भिन्नता।


15

यदि यह ठीक से नहीं है, तो Swiftफ़ाइल को अंदर आयात करना Objective-cइस त्रुटि का कारण बन सकता importहै।

नोट: आपको स्विफ्ट फ़ाइलों को बाहरी रूप से आयात करने की आवश्यकता नहीं है, आपको बस एक फ़ाइल आयात करनी होगी जो स्विफ्ट फ़ाइलों का ध्यान रखती है।

जब आप उद्देश्य-सी परियोजना के अंदर निर्मित / नकल स्विफ्ट फ़ाइल । यह स्वचालित रूप से एक ब्रिजिंग हेडर बनाया होगा।

चेक Objective-C Generated Interface Header Nameपर Targets -> Build Settings

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

ऊपर के आधार पर, मैं आयात करूंगा KJExpandable-Swift.hजैसा कि यह है।

आपका होगा TargetName-Swift.h, जहां TargetNameआपके प्रोजेक्ट के नाम या आपके द्वारा जोड़े गए किसी अन्य लक्ष्य के आधार पर अलग-अलग हो सकते हैं और उस पर चल रहे हैं।

जैसा कि मेरा लक्ष्य नीचे है KJExpandable, इसलिए यह हैKJExpandable-Swift.h
यहां छवि विवरण दर्ज करें


12

पहला कदम:-

प्रोजेक्ट टारगेट चुनें -> बिल्ड सेटिंग -> सर्च ('डिफाइन') -> डिफाइन मॉड्यूल अपडेट वैल्यू की हां

"मॉड्यूल को परिभाषित करता है": हाँ

"हमेशा एंबेड स्विफ्ट स्टैंडर्ड लाइब्रेरीज़": हाँ

"ऑब्जेक्टिव-सी कम्पेटिबिलिटी हैडर स्थापित करें": हाँ

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

दूसरा कदम:-

नीचे दिए गए उद्देश्य के रूप में उद्देश्य C ".h" फ़ाइल में स्विफ्ट फ़ाइल क्लास जोड़ें

#import <UIKit/UIKit.h>

@class TestViewController(Swift File);

@interface TestViewController(Objective C File) : UIViewController

@end

इंपोर्टिव C ".m" फ़ाइल में 'ProjectName (आपका प्रोजेक्ट नाम) -Swift.h' आयात करें

//TestViewController.m 
#import "TestViewController.h"

/*import ProjectName-Swift.h file to access Swift file here*/

#import "ProjectName-Swift.h"

क्लास का फॉरवर्ड डिक्लेरेशन (@class) बहुत अच्छा पॉइंट है! धन्यवाद!
फिलिप ओटो

10

यदि आप एक ही फ्रेमवर्क के भीतर अपने Objective-C फाइलों में Swift कोड आयात कर रहे हैं तो एक कैविएट है । आपको इसे फ्रेमवर्क नाम और कोण कोष्ठक निर्दिष्ट करने के साथ करना होगा:

#import <MyFramework/MyFramework-Swift.h>

MyFrameworkयहां "उत्पाद मॉड्यूल नाम" बिल्ड सेटिंग ( PRODUCT_NAME = MyFramework) है।

बस जोड़ने #import "MyFramework-Swift.h"से काम नहीं चलेगा। यदि आप निर्मित उत्पाद निर्देशिका की जाँच करते हैं (इस तरह के एक #importजोड़े जाने से पहले , इसलिए आपने लक्ष्य में कुछ स्विफ्ट कोड के साथ कम से कम एक सफल निर्माण किया है), तो आपको अभी भी निर्देशिका MyFramework-Swift.hमें फ़ाइल को देखना चाहिए Headers


8

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

@objcMembers
public class MyModel: NSObject {
    var someFlag = false         
    func doSomething() {         
        print("doing something")
    }
}

संदर्भ: https://useyourloaf.com/blog/objc-warnings-upmission-to-swift-4/


अपने कोड में, मैंने इसे स्विफ्ट से स्विफ्ट 4.2 में अपडेट करने के बाद 3. यह काम नहीं कर रहा है
एसएनरुला

आप क्या त्रुटि प्राप्त कर रहे हैं? मैंने Swift4.2 में कोड का उपयोग किया है और इसके काम ठीक है।
प्रशांत भयानी

ठीक है वो बहुत बढ़िया है।
प्रशांत भयानी

4

उसी परियोजना में स्विफ्ट और ऑब्जेक्टिव सी के बारे में पूर्व-रिलीज़ नोट्स चेकआउट करें

https://developer.apple.com/library/prerelease/ios/documentation/Swift/Conceptual/BuildingCocoaApps/MixandMatch.html#//apple_ref/doc/uid/TP40014216-CH10-XID_75

आपको आयात करना चाहिए

#import "SCLAlertView-Swift.h"

3
मुझे यह त्रुटि दिखाई गई: 'SCLAlertView-Swift.h' फ़ाइल नहीं मिली।
विक्टर रेडेंको

2
प्रोजेक्ट का नाम होना चाहिए, न कि फ़ाइल नाम - मेरा उत्तर देखें।
बिल

1
प्रलेखन लिंक के लिए धन्यवाद। यह संदर्भ के लिए उपयोगी था।
louielouie

2
दिए गए लिंक से उद्धृत करने के लिए: The name of this header is your product module name followed by adding "-Swift.h".तो यह वर्ग का नाम नहीं है जैसा आपने लिखा था, लेकिन आपके उत्पाद मॉड्यूल का नाम और जो सभी स्विफ्ट फ़ाइलों को आयात करने का ध्यान रखता है, न कि केवल एक विशिष्ट
क्रिस

4

आप जिस लक्ष्य का निर्माण करने की कोशिश कर रहे हैं, उसकी सेटिंग में "ऑब्जेक्टिव-सी जनरेटेड इंटरफ़ेस हैडर का नाम" खोजें ( MyApp-Swift.hमान लें कि यह है ), और इस सेटिंग का मान आयात करें (#import "MyApp-Swift.h" ) स्रोत फ़ाइल में जहां पहुंचना चाहते हैं अपने स्विफ्ट एपीआई।

इस क्षेत्र के लिए डिफ़ॉल्ट मान है $(SWIFT_MODULE_NAME)-Swift.h। आप इसे देख सकते हैं यदि आप "ऑब्जेक्टिव-सी जेनरेटेड इंटरफेस हैडर नेम" सेटिंग के मान क्षेत्र में डबल-क्लिक करते हैं।

इसके अलावा, यदि आपके मॉड्यूल नाम में डैश हैं (मान लें कि यह कहते हैं My-App), तो $(SWIFT_MODULE_NAME)सभी डैश में अंडरस्कोर को बदल दिया जाएगा। तो आपको जोड़ना होगा #import "My_App-Swift.h"


स्वीकृत से बेहतर है। 20 मिनट बर्बाद मैं वापस haha ​​नहीं मिलेगा।
रूई मुलिया

3

यदि आप स्विफ्ट फ़ाइल को ऑब्जेक्टिव-सी क्लास में उपयोग करना चाहते हैं , तो Xcode 8 के बाद आप नीचे दिए गए चरणों का पालन कर सकते हैं:

यदि आपने उद्देश्य-सी में परियोजना बनाई है:

  1. नई स्विफ्ट फ़ाइल बनाएँ
  2. ब्रिज-हैडर फ़ाइल के लिए Xcode स्वचालित रूप से संकेत देगा
  3. इसे उत्पन्न करो
  4. अपने ऑब्जेक्टिव-सी कंट्रोलर में "प्रोजेक्टनेम-स्विफ्ट.एच" को इम्पोर्ट करें (इंट्रोडक्शन में इंप्लीमेंटेशन इम्पोर्टेन्ट नहीं) (यदि आपके प्रोजेक्ट में नाम के बीच स्पेस है तो अंडरस्कोर "प्रोजेक्ट_नाम-स्विफ्ट.एच" का इस्तेमाल करें)
  5. आप स्विफ्ट में अपने ऑब्जेक्टिव-सी क्लास को एक्सेस कर पाएंगे।

इसे संकलित करें और यदि यह लिंकर त्रुटि उत्पन्न करेगा जैसे: आर्किटेक्चर x86_64 या armv 7 के लिए पिछले फ़ाइलों (2.0) की तुलना में स्विफ्ट भाषा के नए संस्करण (3.0) के साथ संकलित

अपने में एक और बदलाव करें

  1. Xcode -> प्रोजेक्ट -> लक्ष्य -> ​​बिल्ड सेटिंग्स -> लिगेसी स्विफ्ट भाषा संस्करण का उपयोग करें -> हां

बनाएँ और चलाएँ।


1
मुझे इस प्रयोग का विकल्प नहीं मिल रहा है विरासत स्विफ्ट भाषा संस्करण
rd_

1

डैश और अंडरस्कोर से सावधान रहें, उन्हें मिलाया जा सकता है और आपका प्रोजेक्ट नाम और लक्ष्य नाम SWIFT_MODULE_NAME जैसा नहीं होगा।

डैश और अंडरस्कोर


1
#import <TargetName-Swift.h>

जब आप कीबोर्ड से प्रवेश करेंगे तो आप देखेंगे #import <और स्वचालित रूप से Xcode आपको सलाह देगा।


-1

प्रोजेक्ट के अंदर .PCH फ़ाइल खोजें। और फिर #import "YourProjectName-Swift.h"यह जोड़ें श्रेणी हेडर आयात करेगा। ताकि आपको विशिष्ट फ़ाइल में आयात न करना पड़े।

#ifndef __IPHONE_3_0
#warning "This project uses features only available in iPhone SDK 3.0 and later."
#endif


#ifdef __OBJC__
    #import <Foundation/Foundation.h>
    #import <UIKit/UIKit.h>
    #import "YourProjectName-Swift.h"
#endif
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.