Xcode 6 / Beta 4: फ्रेमवर्क लक्ष्य के साथ ब्रिजिंग हेडर का उपयोग असमर्थित है


131

मैंने अभी Xcode 6 Beta 4 में अपग्रेड किया है और इसमें एक फ्रेमवर्क है जिसे मैंने Live Views for Beta 2 में बनाया है। एक अन्य स्विफ्ट बग के कारण , मुझे कुछ Obj-C कोड का उपयोग करने की आवश्यकता है। हालांकि अपग्रेड करते समय, मुझे निम्न त्रुटि मिलती है:

त्रुटि: रूपरेखा लक्ष्य के साथ ब्रिजिंग हेडर का उपयोग असमर्थित है

मैंने जारी नोटों में कुछ भी नहीं देखा है, या किसी अन्य माइग्रेशन पथ को नहीं पाया है। क्या किसी और ने इसे देखा और एक समाधान पर पहुंचे?

मुझे एहसास है कि बीटा 3 ने लाइव दृश्यों के लिए चौखटे की आवश्यकता को समाप्त कर दिया, लेकिन यह मेरे मामले में समझ में आता है कि अगर मैं इसे काम करने के लिए प्राप्त कर सकता हूं। मैं इसे एक कमबैक के रूप में हटा सकता हूं, लेकिन अगर वे पूरी तरह से बीटा 4 में नहीं टूटे हैं तो एक फ्रेमवर्क का उपयोग करना पसंद करेंगे।


"मुझे एहसास है कि बीटा 3 ने रूपरेखा की आवश्यकता को समाप्त कर दिया"। कैसे?
होहल २१'१४ को २३:०२

2
(लाइव विचारों के लिए) - संपादित
क्रिस कॉनवर

1
मैं उसी समस्या में भाग रहा हूं।
साइमन जर्मेन

2
वाह, आपके छोटे से संपादन ने वहाँ मेरे जीवन को इतना बेहतर बना दिया - इस परिवर्तन (फ्रेमवर्क की आवश्यकता को समाप्त करना) के बारे में कहीं भी नहीं सुना और घंटों तक लाइव विचारों के लिए इन सभी फ्रेमवर्क लक्ष्यों के साथ मेरे सिर को पीट रहा था। इस @chrisco के लिए बहुत बहुत धन्यवाद!
योनिक्स

जवाबों:


232

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

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

तो, यह करें:

  1. अपनी ब्रिजिंग हेडर फाइल को हटा दें।
  2. फ्रेमवर्क के लिए बिल्ड सेटिंग्स में ब्रिजिंग हेडर फ़ाइल के संदर्भ निकालें
  3. अपनी छतरी फ़ाइल में आवश्यक हेडर जोड़ें ([ProductName] .h)
  4. शामिल फ़ाइलों को अपने "बिल्ड चरणों" के "हेडर" अनुभाग में सार्वजनिक करें।
  5. स्वच्छ और पुनर्निर्माण।

नोट : "छाता हैडर फ़ाइल" एक फ़ाइल है (जिसका नाम [ProductName] .h) है जो आम तौर पर एक फ्रेमवर्क के सभी सार्वजनिक हेडर का प्रतिनिधित्व करता है। यह आमतौर पर फ्रेमवर्क में निहित अन्य हेडर के लिए #import स्टेटमेंट्स की एक सूची है। Xcode में, यदि आप UIKit.h खोलते हैं, तो आपको एक छाता फ़ाइल का एक अच्छा उदाहरण दिखाई देगा।


3
रसीले उत्तर के लिए धन्यवाद (इस तरह के रूप में चिह्नित)। मैंने उस अनुभाग को पढ़ा था, लेकिन छाता और ब्रिजिंग हेडर के बीच अंतर के रूप में भ्रमित था।
क्रिस कॉनओवर

1
@ zaxy78 इस दस्तावेज़ के "इंपोर्टिंग स्विफ्ट इन ऑब्जेक्टिव-सी" सेक्शन की जाँच करें: developer.apple.com/library/ios/documentation/Swift/Conceptual/…
DeepFriedTwinkie

4
@DeepFriedTwinkie, जब आप कहते हैं कि आप किस छाता फ़ाइल का उल्लेख कर रहे हैं: "अपनी छतरी फ़ाइल में आवश्यक हेडर जोड़ें"? धन्यवाद।
एलन मैकिंगट्राओ

2
मुझे ठीक इसी की आवश्यकता थी। उन्हें सार्वजनिक अनुभाग में जोड़ना फिक्स था।
ओलिवारेसएफ

20
क्या मैं यह मानने में सही हूं कि मैं जिस किसी भी वर्ग को अपने ढांचे में निजी रखना चाहता हूं, जिसे एक स्विफ्ट वर्ग द्वारा उपयोग किया जाना चाहिए, अब मेरे ढांचे का उपयोग करके किसी को भी सार्वजनिक किया जाना चाहिए? एक आदर्श समाधान की तरह प्रतीत नहीं होता है।
ओसप्र

28

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

दूसरी संभावना जो स्विफ्ट को आंतरिक हेडर उपलब्ध कराएगी, उसका विस्तार से वर्णन यहां किया गया है । अनिवार्य रूप से, निम्न बनाए जाने वाले आवश्यकताओं के समान एक मॉड्यूल मानचित्र:

module AwesomeKitPrivate {  
  header "../InternalClass.h"
  export *
}

यह सेटिंग का उपयोग करके XCode में शामिल किया जा सकता है:

SWIFT_INCLUDE_PATHS = $(SRCROOT)/AwesomeKit/ProjectModule  

2
अति उत्कृष्ट! धन्यवाद। सभी शीर्षकों को सार्वजनिक करने के लिए बहुत पसंदीदा तकनीक।
डेविड एच

दूसरों के खिलाफ उस समाधान की दृढ़ता से सलाह दें, और विस्तृत समाधान के लिए दिए गए लिंक को देखने के लिए
Tancrede Chazallet

यह सही उत्तर है, लेकिन इस बात पर निर्भर करता है कि आप जो हासिल करने की कोशिश कर रहे हैं, उसके आधार पर आप कुछ Apple द्वारा प्रदान किए गए मैक्रो का उपयोग करने में सक्षम हो सकते हैं, जो Swift-Objc इंटरॉप के साथ बहुत मदद करते हैं: developer.apple.com/documentation/swift/ …
जो सूसनिक

headerबयान एक रिश्तेदार पथ स्वीकार करता है। जब आप किसी अन्य ढांचे के हेडर को जोड़ना चाहते हैं तो आप क्या करते हैं?
जॉर्जियो

13

उद्देश्य-सी को स्विफ्ट में आयात करना देखें ।

एक ही ढांचे से स्विफ्ट में ऑब्जेक्टिव-सी कोड आयात करना

  1. बिल्ड सेटिंग्स के तहत, पैकेजिंग में, सुनिश्चित करें कि उस रूपरेखा लक्ष्य के लिए परिभाषित मॉड्यूल सेटिंग "हां" पर सेट है।
  2. अपनी छतरी हेडर फ़ाइल में, स्विफ्ट के सामने आने वाले हर ऑब्जेक्टिव-सी हेडर को आयात करें। उदाहरण के लिए:

        #import "XYZ / XYZCustomCell.h"
        #import "XYZ / XYZCustomView.h"
        #import "XYZ / XYZCustomViewController.h"
    
  3. शामिल फ़ाइलों को अपने "बिल्ड चरणों" के "हेडर" अनुभाग में सार्वजनिक करें।

  4. स्वच्छ और पुनर्निर्माण।

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

let myOtherCell = XYZCustomCell()
myOtherCell.subtitle = "Another custom cell"

महत्वपूर्ण: "छाता हैडर फ़ाइल" का अर्थ है फ़ाइल {ModuleName} .h। BTW, लक्ष्य का नाम {ModuleName} .framework है।


1
मैं अपने मॉड्यूल स्विफ्ट फ़ाइल के अंदर objc फ़ाइलों का उपयोग करना चाहता हूं, लेकिन मैं उन्हें अन्य मॉड्यूल के लिए उजागर नहीं करना चाहता। ऐसा मैं किस प्रकार करूं?
सज्जाद हिसैन खान

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