प्रोजेक्ट-Swift.h को एक उद्देश्य-सी वर्ग में आयात करना ... फ़ाइल नहीं मिली


129

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

मैंने एक ही परियोजना में स्विफ्ट और ऑब्जेक्टिव-सी का उपयोग करने पर Apple डॉक्स से परामर्श किया है , साथ ही साथ एसओ ने इस तरह का प्रश्न भी किया है, लेकिन फिर भी कोई फायदा नहीं हुआ: मैं फ़ाइल को नहीं डालने के बाद त्रुटि प्राप्त करना जारी रखता हूं #import "NewTestApp-Swift.h"( NewTestAppउत्पाद का नाम है और मॉड्यूल)।

यहाँ मैंने अभी तक क्या किया है:

  1. में Define Modules, YESऐप के लिए चुना गया।
  2. यह सुनिश्चित करें कि उत्पाद मॉड्यूल नाम में कोई स्थान नहीं है (देखें प्रश्न के नीचे स्क्रीनशॉट)

मैंने #import "NewTestApp-Swift.h"अंदर प्रयोग करने की कोशिश की है ViewController.m, ViewController.hऔर AppDelegate.mउनमें से किसी ने भी काम नहीं किया है।

मैं और क्या गलत कर रहा हूँ? आपकी सहायता के लिए धन्यवाद।


सेटिंग्स का स्क्रीनशॉट:

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


त्रुटियों कि मैं वर्तमान में मुठभेड़ कर रहा हूँ:

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


3
~/Library/Developer/Xcode/DerivedDataमेरे लिए चाल में सभी व्युत्पन्न डेटा को हटा दें ।
wzhang84

यहाँ मैं इस मुद्दे को हल किया है: stackoverflow.com/a/45338549/8102549
schrulnz

जवाबों:


158

मैं एक ही मुद्दे में चल रहा था और obj-c कक्षाओं में तेजी से आयात करने के लिए अपनी परियोजना नहीं प्राप्त कर सका। Xcode 6 का उपयोग करना, (Xcode 6+ के लिए काम करना चाहिए) और इसे इस तरह से करने में सक्षम था ...।

  1. कोई भी वर्ग जिसे आपको .h फ़ाइल में एक्सेस करने की आवश्यकता है, उसे इस तरह आगे की घोषणा करने की आवश्यकता है

@class MySwiftClass;

  1. केवल .m फ़ाइल में, यदि कोड समान प्रोजेक्ट (मॉड्यूल) में है, तो आपको इसे आयात करना होगा

#import "ProductModuleName-Swift.h"

इसके बारे में ऐप्पल डॉक्यूमेंटेशन से लिंक करें

https://developer.apple.com/documentation/swift/imported_c_and_objective-c_apis/importing_swift_into_objective-c


3
जवाब के लिए धन्यवाद। इसने मुझे सही दिशा में ले गया। मेरे पास एक ही मुद्दा था लेकिन एक प्रोटोकॉल के साथ इसलिए मुझे अपनी हेडर फ़ाइल में आयात के बजाय @protocol MySwiftProtocol जोड़ना पड़ा।
पालमे

.h फ़ाइल को वर्ग के बिना घोषित करने की आगे की घोषणा .h फ़ाइल ने मेरे लिए चाल चली। धन्यवाद
सिकंदर

1
ध्यान दें कि यदि आपके उत्पाद के नाम में एक -वर्ण है, तो उत्पन्न हेडर फ़ाइल के नाम के पास रूपांतरण होगा _। उदाहरण के लिए यदि आपका उत्पाद नाम है My-App, तो आप आयात करेंगे My_App-Swift.h
डेवोनी

1
मुझे सही जेनरेट की गई हेडर फ़ाइल नाम खोजने का एक नया तरीका मिला: अपने लक्ष्य पर जाएं -> सेटिंग बनाएँ -> खोज कीवर्डObjective-C Generated Interface Header Name , बिंगो!
इटाची

2
मैंने ये दोनों काम किए हैं, और मैं अभी भी एक ही मुद्दा देख रहा हूं। क्या आपको लगता है कि यह आदेश के साथ करना है?
एरियलएसडीएस

83

यदि स्विफ्ट कोड एक मॉड्यूल के अंदर है (जैसे आपके मामले में):

#import <ProductName/ProductModuleName-Swift.h>

यदि स्विफ्ट कोड परियोजना के अंदर है (मिश्रित स्विफ्ट और ओबीजसी):

#import <ProductModuleName-Swift.h>

आपके मामले में, आपको इस लाइन को * .m फ़ाइल में जोड़ना होगा:

#import <NewTestApp/NewTestApp-Swift.h>

महत्वपूर्ण: आयात विवरण में "<" को देखें

https://developer.apple.com/library/content/documentation/Swift/Conceptual/BuildingCocoaApps/MixandMatch.html


@ Ikocel1 का जवाब देने के लिए धन्यवाद। दुर्भाग्य से ये काम नहीं किया। मैं के रूपांतरों की कोशिश की है <NewTestApp-Swift/NewTestApp-Swift.h>, <NewTestApp/NewTestApp-Swift.h>और <NewTestApp/ViewController-Swift.h>सभी के अंदर ViewController.mहै, लेकिन, के बावजूद त्रुटि "फ़ाइल नहीं मिली" प्राप्त करने के लिए जारी रखने के लिए Cleaningपरियोजना के लिए हर बार एक संयोजन की कोशिश कर के बाद। मैंने सवाल के शरीर में एक स्क्रीनशॉट को शामिल किया है अगर यह मदद करता है।
डेस्पियनिस्ट

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

1
मैं नहीं जानता कि क्या इसका संभव होना सीधे objc कोड और स्विफ्ट कोड को एक ही फाइल में मिलाना है।
ikocel1

1
धन्यवाद, मुझे लगता है कि यह धारणा थी जो मैंने Apple के "मिक्स एंड मैच" दस्तावेज़ पर आधारित थी .. लेकिन मुझे लगता है कि वास्तविक फ़ाइल के अंदर नहीं है। धन्यवाद!
daspianist

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

54

मैं कैसे उद्देश्य-सी में तेजी से आयात करने में कामयाब रहा:

  • YES पर निर्धारित मॉड्यूल को परिभाषित करता है (परियोजना पर - लक्ष्य पर नहीं)
  • उत्पाद मॉड्यूल नाम सेट (लक्ष्य पर - परियोजना पर नहीं)
  • अपने ViewController.m में स्विफ्ट कोड आयात करें:

    #import "MyProductModuleName-Swift.h"
  • अपने उद्देश्य-सी प्रोजेक्ट में एक स्विफ्ट फ़ाइल जोड़ें (फ़ाइल -> नया -> स्विफ्ट) और Xcode उद्देश्य-सी से स्विफ्ट के लिए ब्रिजिंग हेडर बनाएगा, लेकिन यह इसे दूसरे तरीके से भी काम करने के लिए महत्वपूर्ण है - जाहिरा तौर पर।

इस पहेली में आखिरी टुकड़े के लिए स्विफ्टओवर के लिए धन्यवाद मुझे वास्तव में Xcode GUI के माध्यम से एक स्विफ्ट फ़ाइल जोड़ने के लिए धन्यवाद और न केवल इसे बनाने के लिए मेरी परियोजना में मौजूदा स्विफ्ट-फ़ाइलों को खींचकर छोड़ देना: http://nikolakirev.com/log / का उपयोग कर-तेज-इन-उद्देश्य-सी परियोजना


बेहतरीन नोट्स। मैं यह जोड़ना चाहूंगा कि परीक्षण लक्ष्य का अपना मॉड्यूल है और इसका अपना हेडर होगा जिसका नाम "<#TestTargetName #> - Swift.h" होगा और लक्ष्य नामों में से किसी भी स्थान को रिक्त स्थान में परिवर्तित किया जाएगा।
चक कृत्सिंगर

@ holm51 यह पूछने के लिए खेद है, लेकिन कहां है Define Moduleऔर Product Module Name?
मैचिफैंग

-नाम में डैश अंडरस्कोर के _रूप में अच्छी तरह से परिवर्तित हो जाएगा
साइबरएम

11

Xcode 8.2.1 का उपयोग करना और यदि आप प्रोजेक्ट > बिल्ड सेटिंग्स> ऑब्जेक्टिव-सी जेनरेट किए गए इंटरफ़ेस हैडर का नाम देखते हैं , तो यह केवल एक हेडर फाइल दिखाता है, जिसका नाम Product -Siftift.h है

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

मुझे अलग से आयात करने वाले मॉड्यूल के पारंपरिक तरीके की तलाश करके एक ही समस्या का सामना करना पड़ा, लेकिन Xcode और Swift 3 के वर्तमान संस्करण ने इसे सभी मॉड्यूल आयात करने के लिए केवल एक हेडर का उपयोग करने के लिए बदल दिया।


हाय पीटर, आप इस फ़ाइल को कहाँ पा सकते हैं? या यह xcode द्वारा autogenerated है? इसके अलावा, क्या आपको इस बदलाव के कारण अपने पॉडफाइल को अलग तरीके से सेटअप करना है?
रोब नॉरबैक

@RobNorback यदि मैं गलत नहीं हूं, तो आप प्रभाव को देखने के लिए ओब्ज-सी हेडर / कार्यान्वयन फ़ाइल में 'आयात "उत्पाद-स्विफ्ट.एच" लिख सकते हैं, बिना कुछ अतिरिक्त किए। सुनिश्चित करें कि आपकी परियोजना सेटिंग्स में स्विफ्ट और ओबज-सी मिश्रण के लिए हर कॉन्फ़िगरेशन सक्षम है। इसके अलावा, मुझे अभी भी पॉडफाइल के साथ एक समस्या का अनुभव नहीं हुआ है। कृपया मुझे बताएं कि क्या मैं चीजों को अलग तरह से देख रहा हूं।
पीटरसन

धन्यवाद, मैंने इसे डिबग करने के लिए घंटों बिताए थे, और समस्या वास्तव में यह थी कि मेरी परियोजना में प्रत्येक मॉड्यूल अपनी स्वयं की -Swift.hहेडर फ़ाइल उत्पन्न कर रहा था । उन सभी को मजबूर करना (मेरे पास 5 लक्ष्य हैं) एक सामान्य हेडर फ़ाइल का उपयोग करने के लिए मेरे लिए समस्या तय की।
अपूर्व खत्रेजा

@ApoorvKhatreja आपने उन्हें ऐसा करने के लिए कैसे मजबूर किया? फ़ाइल नाम स्पष्ट रूप से लिखा है?
अमित राज

8

इस मुद्दे पर एक घंटा बिताया, इन चरणों का पालन करने से आपको यह समझने में मदद मिलेगी कि क्या गायब है:

  1. Xcode वरीयता खोलें और DerivedData फ़ोल्डर में नेविगेट करें
  2. खोजकर्ता में "स्विफ्ट.एच" खोजें
  3. यदि आपको कोई प्रोजेक्ट-स्विफ्ट.एच फ़ाइल नहीं मिल रही है, तो यह फ़ाइल उत्पन्न नहीं हुई है। आपको आमतौर पर अपने स्विफ्ट क्लास में से एक में @objc को जोड़ना होगा और ऐप को सफलतापूर्वक बनाना होगा, तभी Xcode इस फाइल को जेनरेट करेगा
  4. यदि आपको "xxx-स्विफ्ट.एच" फाइल मिली है, तो सुनिश्चित करें कि आपके आयात विवरण में सही नाम है।

कैसे करने के लिए पता लगाने-तेज-फ़ाइल


कृपया एक से अधिक प्रश्नों के उत्तर न जोड़ें । सबसे अच्छा उत्तर दें और बाकी को डुप्लिकेट के रूप में चिह्नित करें, जब आप पर्याप्त प्रतिष्ठा अर्जित करते हैं। यदि यह एक डुप्लिकेट नहीं है, तो प्रश्न के लिए पोस्ट को दर्जी करें और असमानता के लिए ध्वज।
भार्गव राव

इसके लिए शुक्रिया! मैंने अपने ऐप का डिप्लोमा नाम (लक्ष्य का नहीं) बदला और स्विफ्ट हेडर ने नाम भी बदल दिया। यह एकमात्र तरीका था जो मुझे मिल सकता था।
लुकास पी।

उत्तर पोस्ट करने के लिए धन्यवाद। स्क्रीनशॉट और सटीक बिंदु फ़ॉर्म तुरंत मुझे स्क्रॉल करते हैं + मेरी खोज समाप्त हुई + देखी ... समस्या हल हो गई!
dklt

6

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

एक बार मेरे पास वास्तविक फ़ाइल नाम था जिसे मैंने आयात किया था और परियोजना का निर्माण कर सकता था।


2
यह फ़ाइल कहाँ स्थित है? मैं वहाँ चारों ओर देखता हूं और कुछ भी नहीं पा सका
अमित राज

5

-Swift.hयदि स्विफ्ट कोड किसी एपीआई के माध्यम से @objcया [के बारे में] उजागर करता है, तो एक्सकोड द्वारा स्वचालित रूप से बनाया जाना चाहिए@objcMembers

आमतौर पर एक स्थान जैसा दिखता है

~/Library/Developer/Xcode/DerivedData/
  ProductModuleName-foo/
    Build/
      Intermediates.noindex/
        ProductModuleName.build/
          Debug-iphoneos/
            ProductModuleName.build/
              DerivedSources/
                ProductModuleName-Swift.h

इसके द्वारा बदला जा सकता है

Project editor -> select a target -> Build Settings -> Per-configuration Intermediate Build Files Path

डिफ़ॉल्ट रूप से मान है $(PROJECT_TEMP_DIR)/$(CONFIGURATION)$(EFFECTIVE_PLATFORM_NAME)


2

DEFINE MODULES: हाँ और आयात "प्रोजेक्टनेम-स्विफ्ट.एच" ओएमज-सी श्रेणी की .m फ़ाइल

इसने मेरे लिए ओबज-सी में स्विफ्ट कक्षाओं का उपयोग करने के लिए काम किया।


3
लेकिन अगर मैं objc हैडर में स्विफ्ट क्लास की जरूरत है तो इसे .h फाइल में कैसे आयात करें?
अलेक्जेंडर डानिलोव

1

मेरी टीम के साथ उसी समस्या का सामना किया था जब मैं git का उपयोग कर परियोजना पर काम कर रहा था। एक डेवलपर ने Xcode को पिछले संस्करण (7.3) में अपडेट नहीं किया है जो कि नवीनतम स्विफ्ट 2.2 संस्करण के लिए आवश्यक था। इसलिए, कंपाइलर ने नई स्विफ्ट सिंटैक्स को मान्यता नहीं दी है और स्विफ्ट लाइब्रेरी (प्रोजेक्टनेम-स्विफ्ट.एच) के लिए इंटरफ़ेस उत्पन्न नहीं कर सका है। जांचें कि क्या Xcode संस्करण नवीनतम है!


मेरे मामले में मुझे समस्या का सामना करना पड़ा क्योंकि Xcode द्वारा प्रस्तुत स्विफ्ट 3 के लिए माइग्रेशन को स्थगित करने का निर्णय लिया गया था। परिणामस्वरूप Xcode स्विफ्ट स्रोत फ़ाइलों का निर्माण करने में सक्षम नहीं था और हेडर को शामिल करने के लिए उत्पन्न नहीं करता था।
इतिनवग

1

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

सुनिश्चित करें कि स्विफ्ट फ़ाइलों में कोई सिंटैक्स त्रुटियां नहीं हैं और फिर उद्देश्य सी फ़ाइल में स्विफ्ट हेडर आयात करने का प्रयास करें


1

हेडर फ़ाइल आयात करना, अर्थात

#import "<ProjectName>-Swift.h" 

.h फ़ाइल के भीतर, यह कहते हुए एक त्रुटि उत्पन्न हुई:

-Swift.h 'फ़ाइल नहीं मिली

और निर्माण विफल रहा।

इसके बजाय उपयोग करें:

#import "<ProjectName>-Swift.h"

.m फ़ाइल के भीतर, और भले ही एक ही त्रुटि दिखाई देती हो, फिर भी प्रोजेक्ट चलाना वैसे ही त्रुटि को दबा देता है।

स्विफ्ट क्लासेस तब .m फ़ाइल के भीतर उपलब्ध होते हैं।


1

मुझे परियोजना (लक्ष्य) के नाम के साथ समस्या का सामना करना पड़ा। इसमें प्रतीक "-" शामिल था। इसलिए निर्णय अगला था: यदि परियोजना का नाम "टेस्ट-ऐप" है, तो आयातित वर्ग का नाम "टेस्ट_ऐप-स्वप्न" है।


शानदार समाधान
iOS लाइफ

1

यदि आपके ऐप के नाम में कोई विशेष चरित्र है तो विशेष वर्ण के लिए _ का उपयोग करें।

उदाहरण के लिए यदि आपका ऐप का नाम "Test App®" है

फिर आप "Test_App_-Swift.h" द्वारा स्विफ्ट फ़ाइल आयात कर सकते हैं।

जब आप आयात करते हैं तो स्पेस और ® को _ से बदल दिया जाता है।


0

यदि आपके पास कई लक्ष्य हैं, तो सुनिश्चित करें कि आपने सभी चौखटे बनाए हैं


0

Xcode 11

Xcode 11 पर निर्माण करते समय मैं इस समस्या में भाग गया था। मुझे यह जानने के लिए थोड़ा सा समझ लिया कि क्या गलत था, लेकिन अनिवार्य रूप से, मैंने "डिस्प्ले नेम" को लक्ष्य के "जनरल" टैब पर सीधे Info.plistफाइल में बदलने के बजाय टैब में बदल दिया था। लक्ष्य पर "जानकारी" टैब।

इसके परिणामस्वरूप Xcode 11.5 एक पुनर्लेखन के माध्यम से जा रहा था / बिल्कुल नई कस्टम बिल्ड सेटिंग्स का एक गुच्छा बनाने और ऐप मॉड्यूल और अंतर्निहित .app उत्पाद के नाम को संशोधित करने के लिए। इस मामले में नए प्रदर्शन नाम में एक फॉरवर्ड स्लैश ( /) वर्ण भी था जो अंततः हो सकता है कि यह क्यों नहीं बन रहा था (देखें @Silversky Technology का उत्तर )।

बावजूद, मैंने इसे प्रोजेक्ट फ़ाइल में Xcode 11.5 के सभी स्वचालित परिवर्तनों को पूर्ववत् करके हल कर दिया और मैन्युअल रूप से फ़ाइल में बंडल डिस्प्ले नाम में समान परिवर्तन किया Info.plistऔर सब कुछ पूरी तरह से काम करता है।

काश कि यह आपको बताए कि यह इस तरह से सामान कर रहा था, इससे पहले कि यह आपकी सहमति के बिना यह करता है।


0

सुनिश्चित करें कि आपके स्विफ्ट वर्ग की सार्वजनिक घोषणा है, और NSObject का विस्तार करता है:

public class MySwiftClass: NSObject {
    //...
}

आयात को कोट्स के साथ काम करना चाहिए, कोष्ठक पर नहीं, अगर स्विफ्ट क्लास उसी प्रोजेक्ट में है।


0

यदि आप पहले स्विफ्ट फ़ाइल जोड़ते हैं, तो अपने लक्ष्य में स्विफ्ट फ़ाइल जोड़ने के लिए याद रखें ..., बाएं कॉलम में

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