मैंने स्विफ्ट में एक पुस्तकालय लिखा है और मैं इसे अपने वर्तमान प्रोजेक्ट में आयात करने में सक्षम नहीं था, जो कि ऑब्जेक्टिव-सी में लिखा गया है।
क्या इसे आयात करने के कोई तरीके हैं?
#import "SCLAlertView.swift" - 'SCLAlertView.swift' file not found
मैंने स्विफ्ट में एक पुस्तकालय लिखा है और मैं इसे अपने वर्तमान प्रोजेक्ट में आयात करने में सक्षम नहीं था, जो कि ऑब्जेक्टिव-सी में लिखा गया है।
क्या इसे आयात करने के कोई तरीके हैं?
#import "SCLAlertView.swift" - 'SCLAlertView.swift' file not found
जवाबों:
आपको आयात करने की आवश्यकता है TargetName-Swift.h
। ध्यान दें कि यह लक्षित नाम है - अन्य उत्तर वर्ग नाम का उपयोग करने की गलती करते हैं।
यह एकल फ़ाइल एक ऑटोजेनरेटेड हेडर है जो आपके प्रोजेक्ट के सभी स्विफ्ट वर्गों के लिए ऑब्जेक्टिव-सी इंटरफेस को परिभाषित करता है जो या तो एनोटेट से @objc
या इनहेरिट से किया गया है NSObject
।
बातें:
यदि आपके लक्षित नाम में रिक्त स्थान हैं, तो उन्हें अंडरस्कोर से बदलें (जैसे My Project
बन जाता है My_Project-Swift.h
)
यदि आपका लक्ष्य एक रूपरेखा है, तो आपको आयात करने की आवश्यकता है <TargetName/TargetName-Swift.h>
सुनिश्चित करें कि आपकी स्विफ्ट फ़ाइल लक्ष्य का सदस्य है
Apple वेबसाइट से निर्देश:
एक ही ढांचे से उद्देश्य-सी में स्विफ्ट कोड आयात करने के लिए
बिल्ड सेटिंग्स के तहत , पैकेजिंग में , सुनिश्चित करें कि उस फ़्रेमवर्क लक्ष्य के लिए परिभाषित मॉड्यूल सेटिंग हां पर सेट है । उस फ्रेमवर्क लक्ष्य से स्विफ्ट कोड किसी भी ऑब्जेक्टिव-सी .m फ़ाइल में आयात करें, जो इस सिंटैक्स का उपयोग करके टारगेट टारगेट के भीतर है और उपयुक्त नामों को प्रतिस्थापित करता है:
#import "ProductName-Swift.h"
संशोधन:
आप केवल "ProductName-Swift.h" को .m फ़ाइलों में आयात कर सकते हैं ।
आपके लक्ष्य में मौजूद स्विफ्ट फाइलें इस आयात विवरण वाली ऑब्जेक्टिव-सी .m फाइलों में दिखाई देंगी।
चक्रीय संदर्भों से बचने के लिए, स्विफ्ट को एक उद्देश्य-सी हेडर फ़ाइल में आयात न करें। इसके बजाय, आप इसे एक उद्देश्य-सी हेडर में उपयोग करने के लिए एक स्विफ्ट वर्ग की घोषणा कर सकते हैं। ध्यान दें कि आप उद्देश्य-सी में एक स्विफ्ट वर्ग को उप-वर्ग नहीं कर सकते हैं।
NSObject
!!! आप बस एक class Blah
तेजी से घोषणा कर सकते हैं और यह काम नहीं कर सकता। यह करने की आवश्यकता हैclass Blah : NSObject
यहाँ क्या करना है:
ऑब्जेक्टिव-सी में एक नया प्रोजेक्ट बनाएं
एक नई .swift
फ़ाइल
बनाएँ
अपनी Xcode प्रोजेक्ट फ़ाइल पर क्लिक करें
बिल्ड सेटिंग्स पर क्लिक करें
खोजें सर्च बार के लिए खोज और परिभाषित करता है मॉड्यूल ।
मान को हां में बदलें ।
उत्पाद मॉड्यूल का नाम खोजें ।
मूल्य को अपनी परियोजना के नाम में बदलें।
अनुप्रयोग प्रतिनिधि में, निम्नलिखित जोड़ें: #import "YourProjectName-Swift.h"
नोट: जब भी आप अपनी स्विफ्ट फ़ाइल का उपयोग करना चाहते हैं तो आपको निम्नलिखित लाइन का आयात करना चाहिए:
#import "YourProjectName-Swift.h"
Defines module
में Build settings
करने के लिए Yes
क्या मेरे लिए चीजें तय है!
YourProjectName
में #import "YourProjectName-Swift.h"
कदम 8. उपयोगी से परियोजना का नाम होगा यदि अपने प्रोजेक्ट के नाम विशेष वर्ण हैं और आप सुनिश्चित कैसे वास्तव में आप स्वरूपित करना चाहिए नहीं कर रहे हैं।
यदि आप Cocoapods का उपयोग कर रहे हैं और एक ObjC परियोजना में एक स्विफ्ट पॉड का उपयोग करने की कोशिश कर रहे हैं, तो आप निम्नलिखित कार्य कर सकते हैं:
@import <FrameworkName>;
अपनी प्रोजेक्ट फ़ाइल में सेटिंग बनाने के लिए जाएं और "ऑब्जेक्टिव-सी जेनरेटेड इंटरफेस हैडर नेम । सर्च करें । उस प्रॉपर्टी की वैल्यू वह नाम है जिसे आपको शामिल करना चाहिए।
यदि आपकी "उत्पाद मॉड्यूल नाम" संपत्ति (उपरोक्त संपत्ति जो डिफ़ॉल्ट रूप से निर्भर करती है) अलग-अलग होती है, तो यह इस बात पर निर्भर करता है कि आप परीक्षण / डिबग / रिलीज / आदि के लिए संकलन करते हैं (जैसे कि यह मेरे मामले में है), फिर इस संपत्ति को स्वतंत्र करें कस्टम नाम सेट करके भिन्नता।
यदि यह ठीक से नहीं है, तो Swift
फ़ाइल को अंदर आयात करना Objective-c
इस त्रुटि का कारण बन सकता import
है।
नोट: आपको स्विफ्ट फ़ाइलों को बाहरी रूप से आयात करने की आवश्यकता नहीं है, आपको बस एक फ़ाइल आयात करनी होगी जो स्विफ्ट फ़ाइलों का ध्यान रखती है।
जब आप उद्देश्य-सी परियोजना के अंदर निर्मित / नकल स्विफ्ट फ़ाइल । यह स्वचालित रूप से एक ब्रिजिंग हेडर बनाया होगा।
चेक Objective-C Generated Interface Header Name
पर Targets -> Build Settings
।
ऊपर के आधार पर, मैं आयात करूंगा KJExpandable-Swift.h
जैसा कि यह है।
आपका होगा TargetName-Swift.h
, जहां TargetName
आपके प्रोजेक्ट के नाम या आपके द्वारा जोड़े गए किसी अन्य लक्ष्य के आधार पर अलग-अलग हो सकते हैं और उस पर चल रहे हैं।
जैसा कि मेरा लक्ष्य नीचे है KJExpandable
, इसलिए यह हैKJExpandable-Swift.h
पहला कदम:-
प्रोजेक्ट टारगेट चुनें -> बिल्ड सेटिंग -> सर्च ('डिफाइन') -> डिफाइन मॉड्यूल अपडेट वैल्यू न की हां
"मॉड्यूल को परिभाषित करता है": हाँ ।
"हमेशा एंबेड स्विफ्ट स्टैंडर्ड लाइब्रेरीज़": हाँ ।
"ऑब्जेक्टिव-सी कम्पेटिबिलिटी हैडर स्थापित करें": हाँ ।
दूसरा कदम:-
नीचे दिए गए उद्देश्य के रूप में उद्देश्य 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"
यदि आप एक ही फ्रेमवर्क के भीतर अपने Objective-C फाइलों में Swift कोड आयात कर रहे हैं तो एक कैविएट है । आपको इसे फ्रेमवर्क नाम और कोण कोष्ठक निर्दिष्ट करने के साथ करना होगा:
#import <MyFramework/MyFramework-Swift.h>
MyFramework
यहां "उत्पाद मॉड्यूल नाम" बिल्ड सेटिंग ( PRODUCT_NAME = MyFramework
) है।
बस जोड़ने #import "MyFramework-Swift.h"
से काम नहीं चलेगा। यदि आप निर्मित उत्पाद निर्देशिका की जाँच करते हैं (इस तरह के एक #import
जोड़े जाने से पहले , इसलिए आपने लक्ष्य में कुछ स्विफ्ट कोड के साथ कम से कम एक सफल निर्माण किया है), तो आपको अभी भी निर्देशिका MyFramework-Swift.h
में फ़ाइल को देखना चाहिए Headers
।
यदि आपके पास स्विफ्ट 4 में बनाया गया प्रोजेक्ट है और फिर ऑब्जेक्टिव-सी फाइलें जोड़ी हैं, तो इसे इस तरह से करें:
@objcMembers
public class MyModel: NSObject {
var someFlag = false
func doSomething() {
print("doing something")
}
}
संदर्भ: https://useyourloaf.com/blog/objc-warnings-upmission-to-swift-4/
उसी परियोजना में स्विफ्ट और ऑब्जेक्टिव सी के बारे में पूर्व-रिलीज़ नोट्स चेकआउट करें
आपको आयात करना चाहिए
#import "SCLAlertView-Swift.h"
The name of this header is your product module name followed by adding "-Swift.h".
तो यह वर्ग का नाम नहीं है जैसा आपने लिखा था, लेकिन आपके उत्पाद मॉड्यूल का नाम और जो सभी स्विफ्ट फ़ाइलों को आयात करने का ध्यान रखता है, न कि केवल एक विशिष्ट
आप जिस लक्ष्य का निर्माण करने की कोशिश कर रहे हैं, उसकी सेटिंग में "ऑब्जेक्टिव-सी जनरेटेड इंटरफ़ेस हैडर का नाम" खोजें ( MyApp-Swift.h
मान लें कि यह है ), और इस सेटिंग का मान आयात करें (#import "MyApp-Swift.h"
) स्रोत फ़ाइल में जहां पहुंचना चाहते हैं अपने स्विफ्ट एपीआई।
इस क्षेत्र के लिए डिफ़ॉल्ट मान है $(SWIFT_MODULE_NAME)-Swift.h
। आप इसे देख सकते हैं यदि आप "ऑब्जेक्टिव-सी जेनरेटेड इंटरफेस हैडर नेम" सेटिंग के मान क्षेत्र में डबल-क्लिक करते हैं।
इसके अलावा, यदि आपके मॉड्यूल नाम में डैश हैं (मान लें कि यह कहते हैं My-App
), तो $(SWIFT_MODULE_NAME)
सभी डैश में अंडरस्कोर को बदल दिया जाएगा। तो आपको जोड़ना होगा #import "My_App-Swift.h"
।
यदि आप स्विफ्ट फ़ाइल को ऑब्जेक्टिव-सी क्लास में उपयोग करना चाहते हैं , तो Xcode 8 के बाद आप नीचे दिए गए चरणों का पालन कर सकते हैं:
यदि आपने उद्देश्य-सी में परियोजना बनाई है:
इसे संकलित करें और यदि यह लिंकर त्रुटि उत्पन्न करेगा जैसे: आर्किटेक्चर x86_64 या armv 7 के लिए पिछले फ़ाइलों (2.0) की तुलना में स्विफ्ट भाषा के नए संस्करण (3.0) के साथ संकलित
अपने में एक और बदलाव करें
बनाएँ और चलाएँ।
डैश और अंडरस्कोर से सावधान रहें, उन्हें मिलाया जा सकता है और आपका प्रोजेक्ट नाम और लक्ष्य नाम SWIFT_MODULE_NAME जैसा नहीं होगा।
#import <TargetName-Swift.h>
जब आप कीबोर्ड से प्रवेश करेंगे तो आप देखेंगे #import <और स्वचालित रूप से Xcode आपको सलाह देगा।
प्रोजेक्ट के अंदर .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