Xcode 6 में ऑब्जेक्टिव-सी हेडर नहीं बनाया गया


242

मैं हाल ही में एक मौजूदा परियोजना में स्विफ्ट को जोड़ने के लिए काम कर रहा हूं, ताकि वास्तविक दुनिया में इसे आजमाया जा सके।

प्रोजेक्ट में एक स्विफ्ट स्रोत फ़ाइल जोड़ने पर, मुझे "ब्रिजिंग हैडर" प्राप्त करने के बारे में कोई समस्या नहीं है, अर्थात ऑब्जेक्ट-सी टू स्विफ्ट।

लेकिन *-Swift.hहेडर फाइल जो कि स्विफ्ट कक्षाओं को चिह्नित करने वाली है @objcया तो ओबीजीसी कक्षाओं के चिह्नित या उप-वर्ग के रूप में है, कहीं नहीं पाया जाता है :-(

मुझे अपने मुख्य उप कोड (जो अभी भी उद्देश्य-सी है) में स्विफ्ट में लिखे गए अपने नए उपवर्ग के उपयोग को पूरा करने के बारे में कोई विशेष निर्देश नहीं दिखता है।

जिस ऐप का मैं लीड डेवलपर हूं, उसके पास काफी बड़े कोडबेस (70.000 लाइन) हैं, इसलिए इसे एक बार में ट्रांस्फ़ॉर्म करना सवाल से बाहर है।


5
हाँ यह करता है। यह वास्तव में पूछ रहा है कि XCode IDE में आपको इस स्विफ्ट को प्राप्त करने के लिए कुछ करने की आवश्यकता कहां है -> ओबजेक का नेतृत्व किया गया है, क्योंकि यह किसी मौजूदा ओब्जेक्ट प्रोजेक्ट में स्विफ्ट कोड जोड़ते समय "डिफ़ॉल्ट रूप से" नहीं होता है।
डेविड क्रिस्टेंसन

5
@Popeye मैं असहमत हूँ। इस स्थिति में, यदि आप फ़ाइलों को संपादित कर रहे थे और कमांड लाइन से संकलन कर रहे थे, तो आपको यह समस्या दिखाई नहीं दे रही थी। यह आईडीई है जो आपकी ओर से प्रदर्शन कर रहा है (या प्रदर्शन करने वाला है) जो इस मुद्दे पर है। यह प्रोजेक्ट सेटअप से संबंधित सबसे अधिक संभावना है, जो निश्चित रूप से एक आईडीई फ़ंक्शन है
गैंग

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

3
मैंने इसे गेज और डॉक्यूमेंटेशन की मदद से हल किया। और मैं सिर्फ टैग को इधर-उधर नहीं फेंकता: इस मामले में, हेडर फाइल SHOULD द्वारा बनाई जाए और XCode को दिखाई दे। यह, इस प्रकार त्रुटि नहीं थी।
डेविड क्रिस्टेंसन

3
@Popeye कुछ भी गलत नहीं है - मैंने पृष्ठ 46 से सीधे उद्धरण की नकल की है। आपको एक समान लेकिन अलग-अलग मार्ग मिल गए हैं जो कमोबेश एक ही बात कहते हैं।
कालेब

जवाबों:


165

अब यह काम कर रहा है।

  1. प्रोजेक्ट में एक उत्पाद मॉड्यूल नाम होना चाहिए जिसमें रिक्त स्थान शामिल न हों
  2. परिभाषित करता है कि मॉड्यूल को पैकेजिंग के तहत बिल्ड सेटिंग्स में हां में सेट किया जाना चाहिए ।

अंत में काम करता है। मदद के लिए सभी को धन्यवाद :-)


64
के Build Settingsतहत Packaging, मेरे Defines Moduleलिए सेट है Yesऔर मैंने Product Module Nameबिना रिक्त स्थान बनाए । XCode 6. द्वारा "* -Swift.h" उत्पन्न नहीं किया जाता है ???
लूज

25
एक अतिरिक्त ध्यान दें: मैंने पहली बार उल्लेख किए गए गुणों को लक्ष्य स्तर पर सेट करने का प्रयास किया, और यह काम नहीं किया, फ़ाइल "* -Swift.h" उत्पन्न नहीं हुई थी। जब मैंने इसे प्रोजेक्ट स्तर पर सेट किया तो यह काम किया।
मार्सिन

22
मैं भी एक ही मुद्दा रहा हूँ। मैंने प्रोजेक्ट और लक्ष्य दोनों के लिए Defines Moduleनिर्धारित किया है Yes, और एक Product Module Nameपरिभाषित, जिसमें कोई स्थान नहीं है , लेकिन मैं इस फ़ाइल को उत्पन्न नहीं कर सकता।
क्रेग ओटिस

8
बस के मामले में दूसरों के रूप में उलझन में हैं के रूप में मैं था ... मैं यहाँ अंधा भाग्य था और बस हेडर आयात, क्योंकि यह स्वत: पूर्ण नहीं होगा।
शॉनवॉल

14
आप केवल कार्यान्वयन में हेडर फ़ाइलों (.h) पर आयात नहीं कर सकते।
zirinisp

122

मुझे इसी तरह की समस्या थी और पाया कि आप केवल जोड़ सकते हैं

#import "ProductModuleName-Swift.h"

to obj-c .m फाइलें, नहीं .h फाइलें छाता हैडर के लिए


2
यह सही है, और ... क्या होगा यदि मुझे एक objc हेडर में एक स्विफ्ट क्लास का उपयोग करने की आवश्यकता है? मैंने आगे की घोषणा के साथ कोशिश की, यह भी काम नहीं करता है।
Ixx

2
व्हाट्स, सॉरी, फॉरवर्ड डिक्लेरेशन काम करता है। मैं एक अर्धविराम जोड़ना भूल गया: P
Ixx

14
भविष्य के खोजकर्ताओं के लिए: आपके हेडर में आपकी .h फ़ाइलों के शीर्ष पर @class YourSwiftClass (छाता छत्र आयात करने के बजाय)
rogueleaderr

4
क्या होगा अगर मुझे हेडर फ़ाइल में स्विफ्ट एनम का उपयोग करने की आवश्यकता है?
१५:५० पर जकरेगीज

1
इसके अलावा, अगर "#import ProductModuleName-Swift.h" किसी भी हेडर फ़ाइल में है, तो ProductModuleName-Swift.h फ़ाइल बिल्कुल भी नहीं बनाई जाएगी (Xcode 7.2 के रूप में) इसलिए यदि इसे हटा दिया गया था (जैसे बिल्ड की सफाई करके फ़ोल्डर) तब आपको हर जगह त्रुटि संदेश दिखाई देगा जो फ़ाइल आयात किया गया है, यहां तक ​​कि .m फ़ाइलों के लिए, भ्रम में जोड़ना।
रेनी

59

मैंने पाया कि मुझे सब ठीक करना था फ़ाइल बनाने से पहले बिल्ड त्रुटियों ।

मेरे लिए समस्या यह थी कि यह एक चिकन / अंडे की समस्या थी, इसमें मुझे तब तक कोई बिल्ड त्रुटियाँ नहीं दिखीं, जब तक कि मैं वास्तव में इस #importवक्तव्य पर टिप्पणी नहीं करता :

//#import "ProductModuleName-Swift.h"

जो मेरे स्विफ्ट कोड में अन्य त्रुटियों का एक गुच्छा था।

एक बार जब मैंने इन नई त्रुटियों को ठीक कर लिया और स्रोत के निर्माण को सफलतापूर्वक प्राप्त कर लिया, तो मैंने इसे समाप्त कर दिया #import और बिंगो को ! हेडर सही ढंग से बनाया और आयात किया गया था :)


धन्यवाद यह वही है जो मुझे पकड़ रहा था। स्विफ्ट बिल्ड त्रुटियों को ठीक करने के बाद मैं जाने के लिए अच्छा था। (Xcode संस्करण 6.1.1)
रिक रॉबर्ट्स

10
यह एक महान बिंदु है और Xcode में "त्रुटियों के बाद भी निर्माण जारी रखें" को चालू करने का एक अच्छा कारण है।
केंडल हेल्मसटेटर गेलनर

ठीक ऐसा ही मेरा मामला भी है: लापता-स्विफ्ट-एच स्विफ्ट सोर्स कोड में समान बदलावों के बाद हुआ था
जियोर्जियो कैलज़ोलेटो

3
मुर्गी / अंडे की समस्या को देखने के बाद मुझे अपने मुद्दे का एहसास हुआ, अच्छा सादृश्य
d0ye

यह समस्या हमेशा मेरे (Xcode10) पर लौट रही थी और मैंने बस Xcode को छोटी गाड़ी के रूप में व्याख्या किया था। हालांकि इसका जवाब था
सुमाकुंति २४'१

44

यदि आप मेरे जैसे हैं तो आपको शायद हेडर नाम गलत मिला है। थोड़ी देर के लिए अपने सिर को कोसने के बाद मैंने डेरिवडडाटा में फाइल की तलाश की और यकीन है कि यह पर्याप्त है। मेरे सेटअप पर (मानक व्युत्पन्न डेटा फ़ोल्डर का उपयोग करके, मुझे विश्वास है):

cd ~/Library/Developer/Xcode/DerivedData
find * -iname '*Swift.h'

मिल जाएगा। यदि उस फ़ोल्डर में कुछ भी मेल नहीं खाता है तो Xcode इसे जनरेट नहीं कर रहा है।

मैं Xcode संस्करण 6.2 (6C86e) का उपयोग कर रहा हूं


इसने मेरे लिए यह किया। मैं सोच रहा था कि स्वतः पूर्ण इसे उठा लेगा कि मैंने मान लिया कि यह वहां नहीं था। निर्देशिका में देखकर चीजों को मंजूरी दे दी।
होगा

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

धन्यवाद! मुझे बहुत समय
बचा लिया

43

यदि आपके प्रोजेक्ट मॉड्यूल का नाम इसमें रिक्त स्थान है, तो आपको अवश्य होना चाहिए रिक्त स्थान को अंडरस्कोर से बदलना ।

उदाहरण के लिए, यदि आपके प्रोजेक्ट का नाम "मेरा प्रोजेक्ट" है, तो आप उपयोग करेंगे:

#import "My_Project-Swift.h"


12
यदि आपके प्रोजेक्ट मॉड्यूल नाम में हाइफ़न हैं, तो उन्हें भी अंडरस्कोर से बदला जाना चाहिए। इसलिए यदि आपके प्रोजेक्ट का नाम "My-Project" है तो #import "My_Project.h" का उपयोग करें
जेफ एम्स

6
इसके अलावा, यदि आपका प्रोजेक्ट मॉड्यूल नाम एक नंबर से शुरू होता है, तो इसे अंडरस्कोर के साथ भी बदला जाना चाहिए। "1 परियोजना" "_st_Project-Swift.h" होगी
दान

31

* एकमात्र महत्वपूर्ण बात यह है: *

लक्ष्य में परिभाषित "उत्पाद मॉड्यूल नाम" का उपयोग करने के लिए, इसके बाद -wift.h

#import <Product Module Name>-Swift.h

// in each ObjectiveC .m file having to use swift classes
// no matter in which swift files these classes sit.

कोई फर्क नहीं पड़ता अगर "मॉड्यूल को परिभाषित करता है" परम को हां या नहीं या "उत्पाद मॉड्यूल नाम" प्रोजेक्ट पर सेट नहीं किया गया है।

अनुस्मारक: स्विफ्ट क्लासेस को NSObject से प्राप्त करना चाहिए या @objc विशेषता के साथ टैग किया जाना चाहिए ताकि ऑब्जेक्टिव / फाउंडेशन से अवगत कराया जा सके || कोको ...


1
यह सच है: परियोजना में या लक्ष्य में "परिभाषित मॉड्यूल" के लिए कोई ज़रूरत नहीं है
जियोर्जियो Calzolato

25

मैं एक और कारण जोड़ना चाहता था जिसके साथ आपको एक समस्या मिल सकती है - मैं एक ऐसी रूपरेखा तैयार कर रहा था जो स्विफ्ट और ऑब्जेक्टिव-सी कोड को मिलाए। मैं ढांचे के बाहर स्विफ्ट कक्षाओं को आयात करने में सक्षम नहीं था - मैंने -Swift.h फ़ाइल के लिए जाँच की और यह उत्पन्न हो रहा था लेकिन खाली था।

यह समस्या बहुत, बहुत सरल निकली - मैंने अपनी स्विफ्ट कक्षाओं में से किसी को भी सार्वजनिक घोषित नहीं किया था! जैसे ही मैंने कक्षाओं में सार्वजनिक कीवर्ड जोड़ा, मैं उन्हें फ्रेमवर्क के अंदर और बाहर कक्षाओं से उपयोग करने में सक्षम था।

नोट के अलावा, फ्रेमवर्क के अंदर (केवल एक अन्य उत्तर के रूप में .m फाइलें) मुझे आयात करना पड़ा -Swift.n फाइल:

#import <FrameworkName/FrameworkName-Swift.h>

2
फ्रेमवर्क में मैं यह भी ध्यान देता हूं कि स्विफ्ट कक्षाओं का उपयोग करने के लिए, उन्हें NSObject से विरासत में मिला होना चाहिए (यहां तक ​​कि @objc भी मदद नहीं करेगा) और सभी तरीके / गुण सार्वजनिक होने चाहिए।
dmitrynikolaev

3
कम से कम वर्तमान XCode 7 पूर्व-रिलीज़ में, जब तक आप NSObject से विरासत में नहीं लेते, तब तक वे उत्पन्न स्विफ्ट हेडर में उपलब्ध नहीं होंगे।
dmitrynikolaev

100% ने मेरी समस्या को ठीक नहीं किया। हर समाधान "अपनी कक्षाओं को सार्वजनिक करें" है। इसे मैने किया है। अवधि। यह अभी भी उन परियोजनाओं में स्विफ्ट वर्गों को प्रकट नहीं करता है जो फ्रेमवर्क का उपयोग करते हैं।
डाटाविवो

@lespommes, आपको एक प्रश्न लिखना चाहिए और एक नमूना परियोजना को कहीं रखना चाहिए जो समस्या को प्रदर्शित करता है, कोई यह पता लगा सकता है कि क्या चल रहा है ... मैंने सिर्फ एक संभावित समाधान के रूप में अपना जवाब दिया, क्योंकि यह दृश्यता गलती है जो मैं सबसे अधिक करता हूं बार बार।
केंडल हेल्मसटेटर गेलनर

2
ओह हाँ, आयात के साथ आपके संकेत ने आखिरकार मेरे लिए चाल चली! आपका बहुत बहुत धन्यवाद!
Endowzoner

14

मुझे भी यही समस्या थी। लगता है जैसे आपको अपनी पहली स्विफ्ट फ़ाइल को जोड़ने से पहले सेटिंग्स को समायोजित करना होगा (मॉड्यूल और उत्पाद मॉड्यूल नाम को परिभाषित करता है) ।

यदि आप इसे बाद में करते हैं, तो "* -Swift.h" फ़ाइल इस परियोजना के लिए उत्पन्न नहीं होगी, भले ही आप आगे की स्विफ्ट फाइलें जोड़ दें या स्विफ्ट फ़ाइल को हटा दें और एक नया बनाएं।


मुझे यकीन नहीं है कि यह सच है। मैंने कई स्विफ्ट फ़ाइलों को बनाने के बाद 'मॉड्यूल को परिभाषित करने' को सक्षम करने का निर्णय नहीं लिया था और मैं -Swift.n बस ठीक करने में सक्षम था।
माइकल पीटरसन

मैं वास्तव में यह रिपोर्ट करने के लिए दुखी हूं कि मेरे पास वास्तव में यह समस्या थी :( मुझे अपना .swift हटाकर फिर से जोड़ना था, और फिर सभी ने काम किया।
StuFF mc

2
अब क्या? मैं स्विफ्ट और ओबीजीसी कोड दोनों को बदलने के बीच में हूं। मेरा प्रोजेक्ट- Swift.h अपडेट नहीं हो रहा है। मैंने हेडर फ़ाइल को हटाने की भी कोशिश की।
सुहैल भट्ट

2
मुझे यह एक लिखना था, dev.iachieve.it/iachieveit/?p=980 । स्विफ्ट फ़ाइलों को जोड़ने से पहले बिल्ड सेटिंग्स को अपडेट करने की टिप मेरे लिए महत्वपूर्ण थी।
जो

क्या इसका मतलब है कि मुझे इस परियोजना को फिर से बनाना होगा और अगर मैंने ऐसा नहीं किया तो सब कुछ फिर से जोड़ देगा? कोई फर्क नहीं पड़ता कि मैं क्या करता हूं, मैं उत्पन्न करने के लिए * -Swift.h फ़ाइल प्राप्त नहीं कर सकता।
किग्रीनक

13

मुझे अपने अनुभवों को एक पुरानी objc परियोजना में स्विफ्ट का उपयोग करने की कोशिश करने की अनुमति दें। मैं स्थापित करने के लिए नहीं था Defines moduleकरने के लिए YES

मेरे मामले में मुझे मैन्युअल रूप से यह सुनिश्चित करने की आवश्यकता थी कि एक ओब्जेक ब्रिजिंग हेडर था। केवल निर्मित इंटरफ़ेस हेडर नाम मेरी बिल्ड सेटिंग्स में मौजूद था।

गुम हेडर

इससे एक MyApp-Swift.h फ़ाइल उत्पन्न होती है, लेकिन मेरी स्विफ्ट कक्षाओं के किसी भी निशान के बिना।

Apple दस्तावेज़ीकरण कहता है कि आपको अपनी पहली स्विफ्ट फ़ाइल जोड़ते समय एक ब्रिजिंग हेडर बनाने के लिए प्रेरित किया जाएगा। खैर, मैं नहीं था। मैंने मैन्युअल रूप से जोड़ाMyApp-Bridging-header.h फ़ाइल और "ऑब्जेक्टिव-सी ब्रिजिंग हैडर" फ़ील्ड में इसे इंगित किया। इससे मेरी MyApp-Swift.h फ़ाइल मेरे Swift वर्गों के साथ आबाद हो गई।

डॉक्स: उद्देश्य-सी में स्विफ्ट का आयात करना


हाँ, जो भी कारण के लिए मेरी ओब्जेक्ट Swift.h फ़ाइल स्विफ्ट क्लास हेडर के साथ उत्पन्न हुई थी, जब मैंने प्रोजेक्ट में खाली ब्रिजिंग हेडर फ़ाइल जोड़ी है!
एंड्रयू

मुझे भी। जब तक मैंने खाली ऑब्जेक्टिव-सी ब्रिजिंग हेडर फ़ाइल नहीं जोड़ी, तब तक मेरा स्विफ्ट कोड जनरेट * * -wift.h फाइल में इंपोर्ट नहीं हुआ।
निक

12

यहाँ मॉड्यूलनाम-स्विफ्ट का एक और रूपांतर है। इसे उत्पन्न नहीं किया जा रहा है।

मैंने अपनी परियोजना में IOS चार्ट को शामिल करने का निर्णय लिया, लेकिन उसी निर्देशिका में स्रोतों को नहीं मिलाना चाहता था, इसलिए मैंने अपने कोड के प्रोजेक्ट फ़ोल्डर के आगे चार्ट प्रोजेक्ट फ़ोल्डर रखा। मैं घसीटा चार्ट मेरी परियोजना के नेविगेटर बार में प्रोजेक्ट और अपने प्रोजेक्ट लक्ष्य के दशक में ढांचा शामिल एंबेडेड बाइनरी जनरल परियोजना सेटिंग्स में सूची और सेट एंबेडेड सामग्री स्विफ्ट कोड शामिल अपने प्रोजेक्ट के दशक में हाँ करने के लिए स्विच बिल्ड सेटिंग्स में टैब विकल्प बिल्ड अनुभाग।

मेरी परियोजना का मॉड्यूलनाम- Swift.h फ़ाइल कभी भी यह नहीं बताएगी कि अन्य स्विच या सेटिंग्स यहाँ क्या सुझाव देती हैं। अंत में, लू Z के -Swift.h फ़ाइलों को प्राप्त करने की विधि का उपयोग करते हुए, मैंने देखा कि एक चार्ट-स्विफ्ट.h फ़ाइल मेरे प्रोजेक्ट के xcode बिल्ड निर्देशिका में Charts.framework / Headers / में गहरी उत्पन्न हो रही थी

मेरी परियोजना के स्रोत निर्देशिका में कोड को शामिल किए बिना डैनियल गिंडी के आईओएस-चार्ट स्विफ्ट पैकेज का उपयोग करने का समाधान जोड़ना था:

#import "Charts/Charts-Swift.h"

मेरी परियोजना के डेटा को चार्ट करने वाले मॉड्यूल के लिए।


क्या आईओएस चार्ट में टूल टिप को बदलना / अनुकूलित करना संभव है? यदि हाँ, तो क्या आप एक उदाहरण दे सकते हैं?
अमित चौहान

12

फ़ाइल का नाम हमेशा आपके लक्षित नाम से पहले होता है । इसे उत्पाद नाम के रूप में संदर्भित किया जाता है, लेकिन व्यावहारिक रूप से यह लक्ष्य नाम है। इसलिए यदि आप चाहते हैं कि यह एक नए लक्ष्य के लिए निर्मित हो, तो that_target-Swift.hफ़ाइल की उम्मीद करने के लिए तैयार रहें ।

इसे संभालने का एक तरीका है

  1. अपने प्रत्येक लक्ष्य के लिए एक प्रीप्रोसेसर जोड़ें जो आपके लक्ष्य का नाम स्वयं (रिक्त स्थान के बिना) है। पूर्व। MY_TARGET=1। इसे प्रोजेक्ट सेटिंग्स में जोड़ें-> बिल्ड सेटिंग्स-> अपने प्रत्येक लक्ष्य के लिए प्रीप्रोसेसर मैक्रोज़।
  2. यदि आप PCH फाइल का उपयोग कर रहे हैं,

इन पंक्तियों को PCH फ़ाइल में जोड़ें

#if MY_TARGET==1
#include "My_Target-Swift.h"
#elif THAT_TARGET==1
#include "That_Target-Swift.h" 
#endif

PCH फ़ाइल का उपयोग करने का लाभ यह है कि आपको हेडर को हर जगह शामिल नहीं करना है।

  1. यदि आप PCH फ़ाइल का उपयोग नहीं कर रहे हैं, तो बस इन शीर्ष लाइनों को एक ही हेडर में जोड़ें और उस हेडर को शामिल करें जहाँ आपको स्विफ्ट कक्षाओं का उपयोग करने की आवश्यकता है।

यह ठीक काम करना चाहिए।


मैं वास्तव में हेडर को सीधे आपके स्रोत में आयात करने पर इस समाधान का उपयोग करना पसंद करता हूं। मेरे पास एक जटिल परियोजना संरचना है जहां एक ही स्रोत कोड का उपयोग कई लक्ष्यों / परियोजनाओं द्वारा किया जा रहा है। यह मेरे कोड पर एक गड़बड़ #if #else स्टेटमेंट जोड़ने से बचा जाता है। जवाब के लिए धन्यवाद!
रयान

इससे मेरा दिन बच गया। मैंने "कुछ-स्विफ्ट-हेडर्स.एच" फ़ाइल में कोड की 5 पंक्तियाँ डाल दीं (इसके साथ include)। फिर मैं इस नई फ़ाइल को आयात करता हूं जहां से मुझे इसकी आवश्यकता है। मैं इसे PCH या किसी भी .h फ़ाइल के अंदर डालने का पक्ष नहीं करता हूं ताकि चक्रीय निर्भरता से बचा जा सके और सुविधा हेडर inm फ़ाइलों का उपयोग किया जा सके।
ctietze

यह कई सारे स्तरों पर गलत है। सबसे पहले, .pchफाइलें बहुत हतोत्साहित होती हैं । दूसरे, फ़ाइल नाम में उत्पाद का नाम है और लक्ष्य नाम बिल्कुल नहीं है। यह एक संयोग हो सकता है कि यह एक ही है, लेकिन यह उत्पाद नाम का उपयोग करता है!
इलियान ओनोफ्रेई

10

अगर Xcode वास्तव में आपके -Swift.h हेडर (DerivedData के अंदर गहरे) उत्पन्न कर रहा है, लेकिन यह आपके स्विफ्ट वर्गों को संदर्भित नहीं करता है, तो सुनिश्चित करें कि आपके पास एक ब्रिजिंग हेडर परिभाषित है। जिस तरह से मैं डॉक्स पढ़ता हूं उसमें निहित है कि मुझे केवल स्विफ्ट से ऑब्जेक्टिव-सी को कॉल करने की जरूरत है, लेकिन यह ऑब्जेक्टिव-सी से स्विफ्ट को कॉल करने के लिए भी जरूरी है।

मेरा उत्तर देखें: https://stackoverflow.com/a/27972946/337392

संपादित करें: यह सार्वजनिक बनाम आंतरिक पहुंच संशोधक के कारण है, जैसा कि मैंने अंततः Apple डॉक्स में बताया है: -

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


हां, इससे वास्तव में मदद मिली। मुझे नहीं पता था। मैंने सोचा था, कि स्विफ्ट के उपयोग-मामले से ओबज-सी की जरूरत है।
नोडपॉन्ड

मदद करने के लिए खुश। मैंने उत्तर संपादित किया है क्योंकि मुझे इस व्यवहार का कारण पता चला है।
इकोनेलोन

7

यह देखते हुए कि बहुत से लोगों के यहाँ क्या है, लेकिन एक प्रासंगिक स्क्रीन शॉट जोड़ना। स्विफ्ट और ओबज-सी कोड निश्चित रूप से एक साथ रह सकते हैं। यह सब एक या कोई खेल नहीं है।

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

#import "{product_module_name}-Swift.h"

(जहां # product_module_name} आपकी परियोजना के उत्पाद मॉड्यूल नाम का प्रतिनिधित्व करता है)। अपने उत्पाद मॉड्यूल का नाम या रिक्त स्थान और विशेष वर्णों के साथ कोने के मामलों का पता लगाने की कोशिश करने के बजाय, बस प्रोजेक्ट में बिल्ड सेटिंग्स टैब पर जाएं और "उत्पाद मॉड्यूल नाम" टाइप करें - निरीक्षक आपका खुलासा करेगा। मेरा कुछ ऐसा था जिसकी मुझे उम्मीद नहीं थी। यदि आप भ्रमित हैं तो इस स्क्रीन शॉट को देखें।

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

और स्विफ्ट में काम करने वाले ओबज-सी कोड प्राप्त करने के लिए, आपको बस एक ब्रिजिंग हेडर फ़ाइल जोड़ना होगा और वहां प्रासंगिक ओबज-सी हेडर आयात करना होगा।


1
यह नहीं होना चाहिए #import?
इयूलियन ओनोफ्रेई

मान लीजिए कि मेरे प्रोजेक्ट का नाम एबीसी है, तो "एबीसी-स्विफ्ट.एच", मेरे प्रोजेक्ट में मौजूद होना चाहिए? मैं इसे नहीं ढूँढ सकता। मैन्युअल रूप से इसे बनाने की आवश्यकता है? मैं किसी भी स्विफ्ट फ़ाइलों को अपने आप नहीं बना रहा हूं, बस एक कोको पॉड शामिल है जो स्विफ्ट में लिखा गया है।
nr5

ब्रिजिंग हैडर (आपके मामले में, ABC-Swift.h) स्वचालित रूप से नहीं बनाया गया है। जब आप ओबज-सी परियोजना में अपनी पहली स्विफ्ट फ़ाइल बनाने की कोशिश करते हैं, तो Xcode आम तौर पर आपको एक जोड़ने के लिए प्रेरित करता है। आप यहां दिखाए गए अनुसार खुद पर एक ब्रिजिंग हेडर भी बना सकते हैं (कंट्रोल + एफ 'ब्रिजिंग हेडर' के लिए): developer.apple.com/library/content/documentation/Swift/…
ब्रायन साचेटा

5

सबसे महत्वपूर्ण बात यह है कि यह फ़ाइल अदृश्य है !!! कम से कम यह Xcode6 Beta5 में है। आपके कार्यक्षेत्र में "YourModule-Swift.h" नाम की कोई फ़ाइल नहीं होगी। बस सुनिश्चित करें कि आपके पास मॉड्यूल का नाम है और निर्धारित मॉड्यूल को हां में निर्धारित किया है, और इसे अपने उद्देश्य-सी वर्ग में उपयोग करें।


5

ठीक है, यहां वे सभी चीजें हैं जिनकी आपको वास्तव में आवश्यकता है!

1. आपके द्वारा जोड़ी गई सभी स्विफ्ट फ़ाइलों को हटा दें, और बिना किसी त्रुटि के कोड को संकलित करें।

----------

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

----------

2. "प्रोजेक्ट" बिल्ड सेटिंग्स पर जाएं, और उत्पाद मॉड्यूल नाम सेट करें। प्रोजेक्ट में एक उत्पाद मॉड्यूल नाम होना चाहिए जिसमें रिक्त स्थान शामिल न हों।

----------

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

----------

3.Defines मॉड्यूल को अपनी परियोजना में पैकेजिंग के तहत, बिल्ड सेटिंग्स में हां के लिए सेट किया जाना चाहिए, और लक्ष्य नहीं!

----------

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

----------

4.अब एक तेज फाइल या व्यू कंट्रोलर बनाएं, फाइल-> newFile-> में

----------

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

----------

यह एक ब्रिजिंग-हेडर बनाने के लिए कहेगा, इसे एक बनाने की अनुमति देगा। यदि आपने इसे एक बार अस्वीकार कर दिया है, तो आपको मैन्युअल रूप से -Bridging-Header.h जोड़ना होगा

5.Add @objc कंट्रोलर में, कंपाइलर को यह बताने के लिए कि कुछ स्विफ्ट फ़ाइल है, जिसे ObjectiveC को उजागर करना है

----------

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

----------

6. परियोजना को पूरा करें और किसी भी उद्देश्य नियंत्रक में #import "-Swift.h" आयात करें, और यह काम करेगा! वास्तविक फ़ाइल देखने के लिए आप उस पर कमांड कर सकते हैं!

----------

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

----------

उम्मीद है की यह मदद करेगा!


>> वास्तविक फ़ाइल देखने के लिए आप उस पर कमांड कर सकते हैं! यह ठंडी है
जगन

4

यह उत्तर उपयोग-केस को संबोधित करता है जहां आपके पास पहले से ही कुछ उद्देश्य-सी कोड हो सकते हैं जो स्विफ्ट कक्षाएं कहते हैं और फिर आपको यह त्रुटि प्राप्त होने लगती है।

समस्या कैसे ठीक करें

निम्नलिखित चरणों ने अंततः मेरे लिए सभी मुद्दों को हल कर दिया। मैं "चिकन और अंडे" का उल्लेख करने वाले किसी व्यक्ति के ऊपर पढ़ता हूं और यह ठीक यही अवधारणा है जिसने मुझे इस प्रक्रिया तक पहुंचाया। इस स्पष्ट प्रक्रिया से पता चलता है कि हेडर उत्पन्न होने के बाद स्विफ्ट कक्षाओं को संदर्भित करने वाले किसी भी उद्देश्य-सी कोड को हटाना होगा।

  1. अपने ऑब्जेक्टिव-सी कार्यान्वयन फ़ाइल में #import "ProductModuleName-Swift.h" कथन देखें
  2. उद्देश्य-सी कार्यान्वयन फ़ाइल के किसी भी संदर्भ को स्विफ्ट क्लासेस पर टिप्पणी करें
  3. साफ और निर्माण
  4. सभी त्रुटियों / चेतावनियों को हल करें
  5. #Import "ProductModuleName-Swift.h" कथन पर टिप्पणी निकालें
  6. क्लीन एंड बिल्ड (सफलतापूर्वक किसी भी शेष त्रुटियों को ठीक करना , यह सत्यापित करना कि आप इस बिंदु पर उद्देश्य-सी में किसी भी स्विफ्ट कक्षाओं का संदर्भ नहीं दे रहे हैं । यदि ऐसा है तो अस्थायी रूप से टिप्पणी करें)
  7. सत्यापित करें कि "ProductModuleName-Swift.h" Cmd -Clicking द्वारा #import "ProductModuleName-Swift.h" कथन के वर्ग नाम पर बनाया गया है।
  8. उद्देश्य-सी कार्यान्वयन फ़ाइल में स्विफ्ट कक्षाओं के कोड को संदर्भित करने वाली टिप्पणी को हटा दें।
  9. सामान्य रूप में क्लीन एंड बिल्ड ("ProductModuleName-Swift.h" उत्पन्न किया जाना चाहिए और स्विफ्ट क्लासेस को संदर्भित करने वाले आपके उद्देश्य-सी कोड को सामान्य रूप में उपयोग किया जा सकता है)

नोटा नेने: रिक्त स्थान को अंडरस्कोर में बदलने और यस को मॉड्यूल को परिभाषित करने के बारे में उत्तर, जैसा कि ऊपर दिया गया है, अभी भी इस प्रक्रिया को करते समय लागू होता है, जैसा कि Apple दस्तावेज़ीकरण में निर्दिष्ट नियमों से होता है ।

ब्रिजिंग हैडर पथ

एक त्रुटि में, ProductModuleName-Bridging-Header.h फ़ाइल निर्माण प्रक्रिया के दौरान नहीं मिल रही थी। इस तथ्य ने एक त्रुटि उत्पन्न की

<अज्ञात>: 0: त्रुटि: हेडर ब्रिजिंग /'Users/Saring/Working/abc/abc-Bridging-Header.h 'मौजूद नहीं है

त्रुटि के करीब निरीक्षण ने संकेत दिया कि वर्णित स्थान पर फ़ाइल कभी मौजूद नहीं होगी क्योंकि यह वास्तव में ( एक गलत पथ ) पर स्थित था

'/Users/Shared/Working/abc/abc/abc-Bridging-Header.h'। लक्ष्य / परियोजनाओं की त्वरित खोज मैन्युअल रूप से सुधार करने के लिए सेटिंग्स का निर्माण करती है और abc-Swift.h फ़ाइल फिर से ऑटो उत्पन्न होती है।

निर्माण सेटिंग्स


1
क्या होगा यदि आपकी परियोजना इतनी बड़ी है कि उद्देश्य सी में स्विफ्ट कोड के सभी संदर्भों पर टिप्पणी करना अव्यावहारिक है?
एंड्रयू मोरिस

3

आपको उद्देश्य-सी कक्षाओं में एक हेडर आयात करना होगा, जो है:

#import “ProductModuleName-Swift.h”

यह स्वचालित रूप से उत्पन्न होता है, यह संदर्भ में कहता है, "आपके लक्ष्य में कोई भी स्विफ्ट फ़ाइलें इस आयात विवरण वाली ऑब्जेक्टिव-सी .m फ़ाइलों में दिखाई देंगी।"


24
लेकिन, जब मैं ऐसा करता हूं, मुझे एक बिल्ड त्रुटि मिलती है, AppName-Swift.h मौजूद नहीं है। जबकि, AppName-Bridging-Header.h मौजूद है।
डेविड क्रिस्टेंसन

5
@ डेविडविस्ट्रेंसन: क्या आपको इसका हल मिल गया ?, जैसा कि मैंने एक ही मुद्दे पर अटक गया है
बाशा जूल

2

परियोजना में एक वास्तविक फ़ाइल नहीं बनाई गई है ([ProductModuleName] -Swift.h)। Cmd + आयात पर क्लिक करें या तो इसे ऑन-द-फ्लाई (और-इन-मेमोरी) उत्पन्न करता है ताकि आप देख सकें कि लिंकेज कैसे किया जाता है, या कुछ Xcode कैश डायर में कहीं फ़ाइल खोलता है, लेकिन यह प्रोजेक्ट dir में नहीं है।

आपको निर्धारित मॉड्यूल प्रोजेक्ट प्रोप (लक्ष्य के निर्माण सेटिंग्स में) को हां में सेट करने की आवश्यकता है और यदि आपके मॉड्यूल नाम में [ProductModuleName] -Swift.h फ़ाइल के सभी आयातों में _ का उपयोग किया गया है।

आप इसे सभी .h और .m फ़ाइलों में आयात कर सकते हैं जहाँ आप स्विफ्ट प्रकारों का उपयोग करते हैं या आप इसे .pch में आयात कर सकते हैं।

इसलिए यदि मेरे मॉड्यूल (प्रोजेक्ट) को "टेस्ट प्रोजेक्ट" नाम दिया गया है, तो मैं इसे इस तरह से आयात करूंगा। मेरी परियोजना की (। वहीं) फाइल।

#import "Test_Project-Swift.h"

2

बस किसी के लिए एक सिर जो इस्तेमाल किया "।" वहाँ परियोजना के नाम में। Xcode "की जगह लेगा।" ब्रिजिंग हेडर फ़ाइल के स्विफ्ट संस्करण के लिए एक अंडरस्कोर "_" के साथ। विचित्र रूप से पर्याप्त ब्रिजिंग-हेडर। जो उत्पन्न होता है वह अंडरस्कोर के साथ अवधियों को प्रतिस्थापित नहीं करता है।

उदाहरण के लिए My.Project नाम की एक परियोजना में निम्नलिखित ब्रिजिंग हैडर फ़ाइल नाम होंगे।

ब्रिजिंग-हैडर।

My.Project-ब्रिजिंग-Header.h

Swift.h

My_Project.h

मुझे आशा है कि यह किसी को भी मदद करता है जो एक अवधि का उपयोग करता था और मैं जैसे था वैसे ही अटक गया। यह फ़ाइल निम्न स्थान पर पाई जा सकती है।

Macintosh HD / उपयोगकर्ता / उपयोगकर्ता / उपयोगकर्ता / उपयोगकर्ता / ग्राहक / एक्सकोड /DDivedData/My.Project-fntdulwpbbbbbddbyrkhanemcrfil/Build/Intermediates/My.Project.build/Debug-iphonesimulator/My.Pject।

ख्याल रखना,

जॉन


2

प्रोजेक्ट में मॉड्यूल नाम होना चाहिए जिसमें रिक्त स्थान शामिल न हों। परिभाषित करता है मॉड्यूल पैकेजिंग के तहत, बिल्ड सेटिंग्स में हां में सेट होना चाहिए। #import स्टेटमेंट पर टिप्पणी की:

यदि फिर भी आपको "ProductModuleName-Swift.h" आयात करने में त्रुटि हो रही है

// # आयात "ProductModuleName-Swift.h"

जो मेरे स्विफ्ट कोड में अन्य त्रुटियों का एक गुच्छा था।

एक बार जब मैंने इन नई त्रुटियों को ठीक कर लिया और स्रोत के निर्माण को सफलतापूर्वक प्राप्त कर लिया, तो मैंने #import और बिंगो को अनसुना कर दिया! हेडर सही ढंग से बनाया और आयात किया गया था :)


मेरी समस्या यह थी कि मेरे स्विफ्ट कोड में भी त्रुटियां थीं, लेकिन जब तक मैंने -Swift.h फ़ाइल को अनियोजित नहीं किया, तब तक यह पता नहीं था। धन्यवाद!
विल

1

मुझे एक चाल मिली जो हमेशा मुझ पर काम करती है।

  1. अपनी appDelegate.h फ़ाइल में और अपने ProductName-Prefix.pch फ़ाइल में अपना #import "ProductModuleName-Swift.h" बनाएं। यदि आपके पास यह xcode 6 में नहीं है, तो आप इसे इस तरह से बना सकते हैं। ProjectName-Prefix.pch Xcode 6 में स्वचालित रूप से क्यों नहीं बनाया गया है?
  2. यदि आप अपने "ProductModuleName-Swift.h" के बारे में कोई त्रुटि प्राप्त करते हैं, तो अपने कोड को साफ़ करने के लिए कमांड + शिफ्ट + के, इसे appDelegate.h फ़ाइल से हटा दें।
  3. अपना कोड फिर से साफ करें। अब सब कुछ आकर्षण की तरह काम करेगा
  4. यदि आपको "ProductModuleName-Swift.h" के बारे में फिर से त्रुटि मिलती है, तो अब appDelegate.h फ़ाइल में फिर से बनाएं और अपने कोड को फिर से साफ़ करें।

यह काम करें (हटाएं और AppDelegate.h फ़ाइल से "ProductModuleName-Swift.h" बनाएं और अपना कोड साफ़ करें) हर बार जब आप यह त्रुटि प्राप्त करते हैं तो इसे चुप कर दें।


1

मुझे इसका हल मिल गया

  • SwiftBridge.h बनाएँ
  • #import "ProductModuleName-Swift.h" डालें
  • इस .h फ़ाइल को सार्वजनिक करें (महत्वपूर्ण) फ़ाइल का चयन करें -> फ़ाइल इंस्पेक्टर को दिखाएँ (राइट बार) -> इसे सार्वजनिक करें

अब आप कर सकते हैं

#import "SwiftBridge.h"

इसके बजाय ProductModuleName-Swift.h

यह एक समाधान समाधान है, Xcode के अगले संस्करण के लिए मुझे लगता है कि यह समस्या हल हो जाएगी। सौभाग्य


काम नहीं करता है। बस कोशिश की। लाइन #import “ProductModuleName-Swift.h”बस मूल उद्देश्य-सी कोड फ़ाइल के बजाय SwiftBridge.h फ़ाइल में एक त्रुटि के साथ आती है।
सुपरटेकनोफॉफ

1

मुझे अपने मॉड्यूल नाम / उद्देश्य-सी के स्विफ्ट हेडर के आयात का निर्धारण करने में कठिन समय हो रहा था। मैंने यहाँ बहुत सारे लेख भी पढ़े।

लेकिन इसके सभी विशेष वर्णों के साथ आपके प्रोजेक्ट के नाम का निश्चित उत्तर (यह होना चाहिए। 'या एक संख्यात्मक या एक स्थान) - आप लक्ष्य के निर्माण सेटिंग्स के तहत " उत्पाद मॉड्यूल नाम " में आपके लिए काम करेंगे पाठ पा सकते हैं ।

उदाहरण के लिए मेरा लक्ष्य नाम एक संख्यात्मक - "1mg" से शुरू हुआ और ऊपर उल्लिखित क्षेत्र ने "_mg" को मेरे मॉड्यूल नाम के रूप में दिखाया।

इसलिए मैंने #import "_mg-Swift.h" का इस्तेमाल किया और यह काम कर गया।

उत्पाद मॉड्यूल नाम लक्ष्य की निर्माण सेटिंग्स में सही मॉड्यूल नाम देता है जो आपकी परियोजना के लिए काम करेगा


यदि आप एक स्क्रीनशॉट के लिंक में संपादित कर सकते हैं तो मैं आपके उत्तर को आपके लिए प्रदर्शित करने के लिए संपादित कर सकता हूं।
SuperBiasedMan

1

मेरे मामले में मुझे तैनाती लक्ष्य को कम से कम "OS X 10.9" पर सेट करना -Swift.hथा और हेडर स्वतः उत्पन्न हो गया था। ध्यान रखें कि जब आप परिनियोजन लक्ष्य संस्करण बदलते हैं, तो आप बहुत अधिक डिप्रेशन चेतावनियाँ प्राप्त कर सकते हैं, खासकर जब आपके पास एक पुराना और बहुत बड़ा ऑब्जेक्टिव सी कोड बेस हो। हमारे मामले में हमारे पास XIB फ़ाइलों और दृश्य कक्षाओं में करने के लिए बहुत काम था।


2
दूसरों के लिए - अपने लक्ष्य के लिए बिल्ड सेटिंग्स देखें, सटीक नाम "MyProject-Swift.h" प्राप्त करें - यही आपको उचित ओबजैक फ़ाइलों में "#include" MyProject-Swift.h "के रूप में शामिल करने की आवश्यकता है। BTW, यह। उत्तर ने वास्तव में मेरी मदद की - कुछ पुराने ऑब्जेक्टिव सी ओपन सोर्स को बदलने के लिए काम करना।
डेविड एच।

0

यदि आप पहले कोई प्रोजेक्ट बनाने में सक्षम थे, जिसमें “ProductModuleName-Swift.h” not foundत्रुटि से संबंधित कोई समस्या नहीं है , और अब आपको फिर से वह गलतियां मिल रही हैं, तो इसका कारण आपके हाल के बदलाव हो सकते हैं।

मेरे लिए यह (आकस्मिक) गलत .swiftफ़ाइल एन्कोडिंग था। परिवर्तन को वापस लाना और मैन्युअल रूप से वापस लाना, काम करता है।


0

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


0

मुझे अपने ऑब्जेक्टिव C प्रोजेक्ट से WatchOS2 स्विफ्ट कोड हटाना पड़ा। और उसके बाद ही XCode ने जनरेट करने की पेशकश की -Sift.h


0

मुझे भी इसी तरह की समस्या थी, लेकिन मेरा प्रोजेक्ट पहले से संकलित हो रहा था और अचानक कुछ फ़ाइलों के कोड परिवर्तन के बाद त्रुटि हुई। मुझे यह पता लगाने में समय लगा कि मुझे myproject-स्विफ्ट.एच फ़ाइल के लिए 'फ़ाइल नहीं मिली' त्रुटि क्यों मिल रही है। मेरे द्वारा किए गए कोड में कुछ त्रुटियां थीं। Xcode ने 'फ़ाइल नहीं मिली त्रुटि' को दिखाने के बजाय हर बार उन त्रुटि को इंगित नहीं किया। फिर पिछले संस्करण कोड की प्रतिलिपि मिली और मैंने नए कोड की तुलना की और एक-एक करके फाइल को मिला दिया। प्रत्येक फ़ाइल मर्ज के बाद त्रुटि को खोजने के लिए प्रोजेक्ट का अनुपालन किया। इसलिए नीचे की रेखा यह है कि यदि आपके कोड में त्रुटि है तो Xcode सिर्फ myproject-स्विफ्ट.एच फाइल के लिए 'फाइल नहीं मिली त्रुटि' प्रदर्शित कर सकता है। सबसे अधिक संभावना है कि आपके प्रोजेक्ट में संकलन त्रुटि है। उन त्रुटि को साफ करें और यह काम करेगा।


0

यदि आप कोकोपोड्स (और परियोजना के बजाय कार्यक्षेत्र से बाहर काम कर रहे हैं) जैसी किसी चीज का उपयोग कर रहे हैं, तो परियोजना को खोलने और कार्यक्षेत्र और भवन को खोलने से पहले इसका निर्माण करने का प्रयास करें। YMMV।


0

कभी-कभी आपको बस परेशान करने की आवश्यकता होती है और फिर obj-c .m फ़ाइल पर फिर से लक्ष्य सदस्यता सेट करें।

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