दिलचस्प पोस्ट
मैं किसी पाठ फ़ाइल में एक उपप्रोसेस कॉल कैसे पाइप कर सकता हूं? जावास्क्रिप्ट RegExp + शब्द सीमाएं + यूनिकोड वर्ण Google Maps V3 में दो बिंदुओं के बीच दूरी की गणना करें डबल। समानता के लिए एप्सिलॉन, से बड़ा, कम से कम, या उसके बराबर या उससे अधिक के बराबर MATLAB में अंडाकार और अंडाकार आकर्षित जावा में स्ट्रिंग सरणी रूपांतरण के लिए स्ट्रिंग उपकरण के लिए आईओएस फ्रेमवर्क बनाना और बिटोड सक्षम करने के साथ यूनिवर्सल कॉन्फ़िगरेशन और कमांड लाइन टर्मिनल से बीटोड को अक्षम करना संसाधन आईडी से संसाधन नाम कैसे प्राप्त करें एचटीएमएल तालिका की पंक्तियों और स्तंभों को कैसे उलटा (स्थानांतरित) करना है? एक url के कनेक्शन को प्रतिबंधित करने के लिए socket.io मूल सेट कैसे करें एमवीसी 3 jQuery के प्रमाणीकरण / संख्या / दशमलव क्षेत्र के वैश्वीकरण JDBC का उपयोग कर एसक्यूएल स्क्रिप्ट फ़ाइल को कैसे निष्पादित करें। कैसे सी # में एक बाइट में एक स्ट्रीम परिवर्तित करने के लिए? अजगर ऑक्साइड को कन्वर्ट करने के लिए? प्रक्रिया में AppDomains सूची

उद्देश्य-सी के अंदर स्विफ्ट क्लास का उपयोग नहीं किया जा सकता

मैं अपने ऐप में Swift कोड को एकीकृत करने का प्रयास करता हूं। मेरा ऐप Objective-C में लिखा गया Objective-C और मैंने Swift क्लास को जोड़ा है। मैंने यहाँ वर्णित सब कुछ किया है लेकिन मेरी समस्या यह है कि Xcode -Swift.h फ़ाइल नहीं बनाई है, केवल ब्रिजिंग हेडर। तो मैंने इसे बनाया है, लेकिन यह वास्तव में खाली है। मैं स्विफ्ट में अपने सभी ओब्जेसी क्लासेस का उपयोग कर सकता हूं, लेकिन मैं इसे ठीक इसके विपरीत नहीं कर सकता। मैंने अपने स्विफ्ट क्लास को @objc साथ चिह्नित किया लेकिन यह मदद नहीं करता अब मैं क्या कर सकता हूँ?

संपादित करें: ऐप्पल कहते हैं: "जब आप स्विफ्ट कोड को ऑब्जेक्टिव-सी में आयात करते हैं, तो आप इन फ़ाइलों को ऑब्जेक्टिव-सी में उजागर करने के लिए एक Xcode-generated हेडर फाइल पर भरोसा करते हैं। […] इस हेडर का नाम आपके उत्पाद मॉड्यूल का नाम है "-स्विफ्ट एच" जोड़कर। "

अब जब मैं उस फाइल को आयात करना चाहता हूं, तो यह एक त्रुटि देता है:

  //MainMenu.m #import "myProjectModule-Swift.h" //Error: 'myProjectModule-Swift.h' file not found @implementation MainMenu 

यहां मेरी एफबीएमएनेजर.swift फाइल है:

 @objc class FBManager: NSObject { var descr = "FBManager class" init() { super.init() } func desc(){ println(descr) } func getSharedGameState() -> GameState{ return GameState.sharedGameState() //OK! GameState is written in Objective-C and no error here } } 

वेब के समाधान से एकत्रित समाधान "उद्देश्य-सी के अंदर स्विफ्ट क्लास का उपयोग नहीं किया जा सकता"

मैं अपने Xcode उद्देश्य- सी आधारित परियोजना में Swift को सक्षम करने के लिए लगभग 4 घंटे बिताए। मेरा " myproject-Swift.h " फ़ाइल सफलतापूर्वक बनाई गई थी, लेकिन मेरा myproject-Swift.h मेरे Swift-classes नहीं देख रहा था। इसलिए, मैंने एक नया Xcode Objc- आधारित प्रोजेक्ट बनाने का निर्णय लिया और अंत में मुझे सही जवाब मिला! उम्मीद है कि इस पोस्ट में किसी को मदद मिलेगी 🙂

Xcode Objc- आधारित प्रोजेक्ट के लिए कदम स्विफ्ट एकीकरण द्वारा कदम:

  1. नया *.swift फ़ाइल बनाएं (Xcode में) या खोजक का उपयोग कर इसे जोड़ें
  2. Xcode आपको इसके बारे में पूछने पर Objective-C bridging header बनाएं
  3. @objc क्लास को @objc विशेषता के साथ लागू करें:

     import UIKit @objc public class CustomView: UIView { override func draw(_ rect: CGRect) { // Drawing code } } 
  4. सेटिंग खोलें और उन पैरामीटरों की जांच करें:

    • मॉड्यूल परिभाषित करता है: YES
    • उत्पाद मॉड्यूल नाम: myproject

      सुनिश्चित करें कि आपके उत्पाद मॉड्यूल नाम में कोई विशेष वर्ण नहीं हैं

    • उद्देश्य-सी संगतता शीर्षलेख स्थापित करें: YES

      प्रोजेक्ट में *.swift फ़ाइल जोड़ लेने के बाद यह प्रॉपर्टी बिल्ड सेटिंग में दिखाई देगी

    • उद्देश्य-सी उत्पन्न इंटरफेस हैडर: myproject-Swift.h

      यह हेडर एक्सकोड द्वारा उत्पन्न ऑटो है

    • उद्देश्य-सी ब्रिजिंग हेडर: $(SRCROOT)/myproject-Bridging-Header.h -Bridging- $(SRCROOT)/myproject-Bridging-Header.h
  5. आपके *। एम फ़ाइल में स्विफ्ट इंटरफ़ेस हेडर आयात करें

     #import "myproject-Swift.h" 

    त्रुटियों और चेतावनियों पर ध्यान न दें

  6. स्वच्छ और अपने Xcode परियोजना के पुनर्निर्माण
  7. फायदा!

हेडर फाइल को खुद न बनाएं आपके द्वारा बनाई गई एक को हटाएं।

सुनिश्चित करें कि आपके स्विफ्ट क्लास को @objc साथ टैग किया @objc या @objc से प्राप्त होने वाले क्लास से प्राप्त होता है (प्रत्यक्ष या अप्रत्यक्ष रूप से)।

यदि आपके पास अपनी प्रोजेक्ट में कोई कंपाइलर त्रुटियां हैं तो Xcode फ़ाइल नहीं जनरेट करेगा – सुनिश्चित करें कि आपका प्रोजेक्ट साफ-सफाई बनाता है।

Xcode को अपना काम करने की अनुमति दें, स्विफ्ट हेडर मैन्युअल रूप से जोड़ें न बनाएं। अपने स्विफ्ट क्लास से पहले बस @ बॉजेक को जोड़ें

 @objc class YourSwiftClassName: UIViewController 

अपने प्रोजेक्ट में झंडों के नीचे खोज की जा रही है और इसे YES (परियोजना और लक्ष्य दोनों) में बदलें

 Defines Module : YES Always Embed Swift Standard Libraries : YES Install Objective-C Compatibility Header : YES 

फिर प्रोजेक्ट को साफ करें और एक बार निर्माण करें, सफल बनाने के बाद (यह शायद होना चाहिए) हेडर फाइल के नीचे अपने उद्देश्य- c class .m फ़ाइल में आयात करें

 #import "YourProjectName-Swift.h" 

Boooom!

एक फ्रेमवर्क लक्ष्य के साथ आप के लिए भी संभवतः सहायक:

ऑटो जनरेटेड हेडर फाइल का आयात स्टेटमेंट ऐप लक्ष्यों से कुछ अलग दिखता है । अन्य उत्तरों में उल्लिखित अन्य चीजों के अलावा उपयोग करें

 #import <ProductName/ProductModuleName-Swift.h> 

के बजाय

 #import "ProductModuleName-Swift.h" 

रूपरेखा लक्ष्य के लिए मिक्स एंड मैक पर एपल्स दस्तावेज के अनुसार

सुनिश्चित करें कि आपका प्रोजेक्ट एक मॉड्यूल को परिभाषित करता है और आपने मॉड्यूल को एक नाम दिया है। फिर पुनर्निर्माण, और Xcode -Swift.h हैडर फ़ाइल बना देगा और आप आयात करने में सक्षम होंगे।

आप अपनी परियोजना सेटिंग्स में मॉड्यूल परिभाषा और मॉड्यूल नाम सेट कर सकते हैं।

मेरे पास एक ही मुद्दा था और इसे मॉड्यूल नाम में विशेष प्रतीकों को बदल दिया गया xcode द्वारा प्रतिस्थापित किया गया (मेरे मामले में डैश को अंडरस्कोर बना दिया गया)। प्रोजेक्ट सेटिंग्स में अपनी परियोजना के लिए मॉड्यूल का नाम खोजने के लिए "मॉड्यूल नाम" की जांच करें। उसके बाद या तो ModuleName-Swift.h उपयोग करें या सेटिंग्स में मॉड्यूल का नाम बदलें।

फाइल स्वचालित रूप से बनाई गई है (यहाँ Xcode 6.3.2 के बारे में बात कर रही है) लेकिन आप इसे नहीं देखेंगे, क्योंकि यह आपके व्युत्पन्न डेटा फ़ोल्डर में है। @objc साथ अपनी तेज वर्ग को चिह्नित करने के बाद, संकलित करें, फिर अपने व्युत्पन्न डेटा फ़ोल्डर में Swift.h खोज करें। आपको वहाँ स्विफ्ट हेडर ढूंढना चाहिए

मुझे समस्या थी, कि Xcode ने मेरा my-Project-Swift.h को my_Project-Swift.h Xcode "." "-" पसंद नहीं करता "." "-" "." "-" आदि प्रतीक उपरोक्त विधि से आप फ़ाइल का नाम ढूंढ सकते हैं और उसे उद्देश्य- C कक्षा में आयात कर सकते हैं।

बस .im या .h फ़ाइल में #import "myProject-Swift.h" शामिल करें

पीएस आप फ़ाइल इंस्पेक्टर में "myProject-Swift.h" नहीं मिलेगा यह छिपा हुआ है। लेकिन यह एप्लिकेशन द्वारा स्वचालित रूप से उत्पन्न होता है

विवरण: Xcode 8.1 में स्विफ्ट 3 कोड के साथ उद्देश्य-सी प्रोजेक्ट

कार्य:

  1. उद्देश्य- c कक्षा में तेजी से बढ़त का उपयोग करें
  2. स्विफ्ट क्लास में उद्देश्य- c enum का उपयोग करें

पूर्ण नमूना

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

ObjcClass.h

 #import <Foundation/Foundation.h> typedef NS_ENUM(NSInteger, ObjcEnum) { ObjcEnumValue1, ObjcEnumValue2, ObjcEnumValue3 }; @interface ObjcClass : NSObject + (void) PrintEnumValues; @end 

ObjcClass.m

 #import "ObjcClass.h" #import "SwiftCode.h" @implementation ObjcClass + (void) PrintEnumValues { [self PrintEnumValue:SwiftEnumValue1]; [self PrintEnumValue:SwiftEnumValue2]; [self PrintEnumValue:SwiftEnumValue3]; } + (void) PrintEnumValue:(SwiftEnum) value { switch (value) { case SwiftEnumValue1: NSLog(@"-- SwiftEnum: SwiftEnumValue1"); break; case SwiftEnumValue2: case SwiftEnumValue3: NSLog(@"-- SwiftEnum: long value = %ld", (long)value); break; } } @end 

उद्देश्य- C कोड में स्विफ्ट कोड का पता लगाएं

मेरे नमूना में मैं स्विफ्ट कोड का इस्तेमाल स्विफ्ट कोड को उद्देश्य-सी में पता लगा सकता हूं। यह फ़ाइल स्वचालित रूप से उत्पन्न होती है (मैंने किसी प्रोजेक्ट में इस हैडर फ़ाइल की भौतिक प्रतिलिपि नहीं बनाई है), और आप केवल इस फ़ाइल का नाम सेट कर सकते हैं:

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

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

यदि कंपाइलर आपकी हेडर फाइल स्विफ्ट कोड नहीं खोज सकता, तो प्रोजेक्ट को संकलित करने का प्रयास करें।

2. स्विफ्ट क्लास जो उद्देश्य- C enum का उपयोग करता है

 import Foundation @objc enum SwiftEnum: Int { case Value1, Value2, Value3 } @objc class SwiftClass: NSObject { class func PrintEnumValues() { PrintEnumValue(.Value1) PrintEnumValue(.Value2) PrintEnumValue(.Value3) } class func PrintEnumValue(value: ObjcEnum) { switch value { case .Value1, .Value2: NSLog("-- ObjcEnum: int value = \(value.rawValue)") case .Value3: NSLog("-- ObjcEnum: Value3") break } } } 

स्विफ्ट कोड में उद्देश्य-सी कोड खोजें

आपको ब्रिजिंग हैडर फ़ाइल बनाने की आवश्यकता है। जब आप स्विफ्ट फाइल को ऑब्जेक्टिव-सी प्रोजेक्ट में जोड़ते हैं, या स्विफ्ट प्रोजेक्ट XCode में Object-C फ़ाइल आपको ब्रिजिंग हैडर बनाने के लिए सुझाव देगा।

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

आप ब्रिजिंग हैडर फ़ाइल नाम यहां बदल सकते हैं:

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

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

 #import "ObjcClass.h" 

प्रयोग

 #import "SwiftCode.h" ... [ObjcClass PrintEnumValues]; [SwiftClass PrintEnumValues]; [SwiftClass PrintEnumValue:ObjcEnumValue3]; 

परिणाम

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


अधिक नमूने

पूर्ण एकीकरण कदम उद्देश्य सी और स्विफ्ट ऊपर वर्णित है । अब मैं कुछ अन्य कोड उदाहरण लिखूंगा।

3. उद्देश्य- c कोड से स्विफ्ट क्लास को कॉल करें

स्विफ्ट क्लास

 import Foundation @objc class SwiftClass:NSObject { private var _stringValue: String var stringValue: String { get { print("SwiftClass get stringValue") return _stringValue } set { print("SwiftClass set stringValue = \(newValue)") _stringValue = newValue } } init (stringValue: String) { print("SwiftClass init(String)") _stringValue = stringValue } func printValue() { print("SwiftClass printValue()") print("stringValue = \(_stringValue)") } } 

उद्देश्य-सी कोड (कॉलिंग कोड)

 SwiftClass *obj = [[SwiftClass alloc] initWithStringValue: @"Hello World!"]; [obj printValue]; NSString * str = obj.stringValue; obj.stringValue = @"HeLLo wOrLd!!!"; 

परिणाम

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

4. स्विफ्ट कोड से ऑडियंस-सी क्लास को कॉल करें

उद्देश्य-सी क्लास (ObjcClass.h)

 #import <Foundation/Foundation.h> @interface ObjcClass : NSObject @property NSString* stringValue; - (instancetype) initWithStringValue:(NSString*)stringValue; - (void) printValue; @end 

ObjcClass.m

 #import "ObjcClass.h" @interface ObjcClass() @property NSString* strValue; @end @implementation ObjcClass - (instancetype) initWithStringValue:(NSString*)stringValue { NSLog(@"ObjcClass initWithStringValue"); _strValue = stringValue; return self; } - (void) printValue { NSLog(@"ObjcClass printValue"); NSLog(@"stringValue = %@", _strValue); } - (NSString*) stringValue { NSLog(@"ObjcClass get stringValue"); return _strValue; } - (void) setStringValue:(NSString*)newValue { NSLog(@"ObjcClass set stringValue = %@", newValue); _strValue = newValue; } @end 

स्विफ्ट कोड (कॉलिंग कोड)

 if let obj = ObjcClass(stringValue: "Hello World!") { obj.printValue() let str = obj.stringValue; obj.stringValue = "HeLLo wOrLd!!!"; } 

परिणाम

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

5. उद्देश्य- c कोड में स्विफ्ट एक्सटेंशन का उपयोग करें

स्विफ्ट एक्सटेंशन

 extension UIView { static func swiftExtensionFunc() { NSLog("UIView swiftExtensionFunc") } } 

उद्देश्य-सी कोड (कॉलिंग कोड)

 [UIView swiftExtensionFunc]; 

6. स्विफ्ट कोड में उद्देश्य-सी एक्सटेंशन का उपयोग करें

उद्देश्य-सी एक्सटेंशन (UIViewExtension.h)

 #import <UIKit/UIKit.h> @interface UIView (ObjcAdditions) + (void)objcExtensionFunc; @end 

UIViewExtension.m

 @implementation UIView (ObjcAdditions) + (void)objcExtensionFunc { NSLog(@"UIView objcExtensionFunc"); } @end 

स्विफ्ट कोड (कॉलिंग कोड)

 UIView.objcExtensionFunc() 

दो शर्त है,

  • उद्देश्य सी फ़ाइल में अपनी स्विफ्ट फाइल का उपयोग करें
  • स्विफ्ट फ़ाइल में अपना उद्देश्य सी फ़ाइल का उपयोग करें

तो, उस प्रयोजन के लिए, आपको इन चरणों का पालन करना होगा:

  • उद्देश्य- c प्रोजेक्ट में अपनी स्विफ्ट फाइल या उपाध्यक्ष के विपरीत जोड़ें।
  • हेडर (.एच) फ़ाइल बनाएं
  • सेटिंग्स बनाने के लिए जाएं और खोज के साथ नीचे दिए चरणों का पालन करें,

    1. इस पाठ को "ब्रिड्स" के लिए खोजें और अपनी हेडर फाइल का पथ सेट करें।
    2. "मॉड्यूल परिभाषित करता है": हाँ।
    3. "हमेशा स्विफ्ट स्टैंडर्ड पुस्तकालयों को एम्बेड करें": हाँ।
    4. "उद्देश्य-सी संगतता हैडर स्थापित करें": हाँ।

उसके बाद, अपनी परियोजना को साफ और पुनर्निर्माण करें।

उद्देश्य सी फ़ाइल में अपनी स्विफ्ट फाइल का उपयोग करें

उस मामले में, पहले अपने वर्ग को स्विफ्ट फ़ाइल में "पहले @ बजे" लिखें।

उसके बाद, आपके उद्देश्य सी फ़ाइल में, इसे लिखें,

  #import "YourProjectName-Swift.h" 

स्विफ्ट फ़ाइल में अपना उद्देश्य सी फ़ाइल का उपयोग करें

उस स्थिति में, आपकी हेडर फाइल में, इसे लिखें,

  #import "YourObjective-c_FileName.h" 

उम्मीद है इससे आपको मदद मिलेगी।

@ सिग का जवाब सबसे अच्छा है, हालांकि, यह मेरे लिए पुराने प्रोजेक्ट (नया नहीं!) के साथ काम नहीं करता, मुझे कुछ संशोधनों की आवश्यकता थी कई रूपांतरों के बाद मुझे मेरे लिए नुस्खा मिला (XCode 7.2 का प्रयोग):

  1. उत्पाद मॉड्यूल नाम: $ (PRODUCT_NAME: c99extidentifier)
  2. मॉड्यूल परिभाषित करता है: नहीं
  3. एम्बेडेड सामग्री स्विफ्ट शामिल हैं: नहीं
  4. उद्देश्य-सी संगतता शीर्षलेख स्थापित करें: हाँ
  5. उद्देश्य-सी ब्रिजिंग हेडर: प्रोजेक्ट-एन-ब्रिजिंग-हेडर एच

अंतिम बिंदु (5) महत्वपूर्ण था। मैं इसे केवल दूसरे खंड (लक्ष्य फ़ील्ड) पर डाल दिया, परियोजना फ़ील्ड खाली छोड़ दी जानी चाहिए: यहां छवि विवरण दर्ज करें अन्यथा, यह मेरे लिए "प्रोजेक्ट-स्विफ्ट एच" फाइल का निर्माण नहीं करता (यह तेज तरीके शामिल नहीं था)

मेरे मामले में, इन चरणों के अलावा:

  1. उत्पाद मॉड्यूल नाम: myproject
  2. मॉड्यूल परिभाषित करता है: हाँ
  3. एम्बेडेड सामग्री में स्विफ्ट होता है: हाँ
  4. उद्देश्य-सी संगतता शीर्षलेख स्थापित करें: हाँ
  5. उद्देश्य-सी ब्रिजिंग हेडर: $ (SRCROOT) / स्रोत / स्विफ्टब्रिडिंग। एच

मुझे productName-Swift.h फ़ाइल बनाने के लिए कक्षा को सार्वजनिक रूप से रखने की आवश्यकता है:

 import UIKit @objc public class TestSwift: NSObject { func sayHello() { print("Hi there!") } } 

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

मुझे एक ही समस्या थी और अंत में यह प्रकट हुआ कि वे एक ही लक्ष्य से जुड़ा नहीं थे। ObjC वर्ग Target1 और Target2 से जुड़ा है, स्विफ्ट क्लास केवल 1 लक्ष्य से जुड़ा है और ObjC क्लास के अंदर दिखाई नहीं दे रहा है।

उम्मीद है कि यह किसी को मदद करता है

मेरे पास एक ही त्रुटि है: myProjectModule-Swift.h फ़ाइल नहीं मिली ", लेकिन, मेरे मामले में, वास्तविक कारण गलत तैनाती लक्ष्य में था:" Swift 10.9 से पहले OS X पर अनुपलब्ध है; कृपया MACOSX_DEPLOYMENT_TARGET को 10.9 या उसके बाद के संस्करण में सेट करें (वर्तमान में यह '10 .7 'है) "इसलिए, जब मैंने 10.9 – परियोजना पर तैनाती लक्ष्य को बदल दिया है, तो सफलतापूर्वक संकलित किया गया था

मेरा मुद्दा यह था कि -swift.h फ़ाइल की स्वत: पीढ़ी CustomDebugStringConvertible के उपवर्ग को समझने में सक्षम नहीं थी। मैंने वर्ग को इसके बदले NSObject के उपवर्ग में बदल दिया। उसके बाद, -swift.h फ़ाइल में अब क्लास को ठीक से शामिल किया गया।

मेरी समस्या मैं एक्सकोड पुल फ़ाइल बनाया के बाद फंस गया था, लेकिन फिर भी मुझे हैडर फ़ाइल नाम MYPROJECTNAME-swift.h में त्रुटि मिली

1.मैं टर्मिनल में जांच और सभी ऑटो बनाया तेज पुल फ़ाइलों के लिए खोज:

find ~/library/Developer/Xcode/DerivedData/ -name "*-Swift.h"|xargs basename|sort -

आप देखते हैं कि क्या xcode बनाया।

  1. मेरे मामले में, मेरे पास मेरे प्रोजेक्ट नाम और xcode में स्थान था, यह '_'

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

इसलिए मेरे सभी उद्देश्य-सी वर्गों में जो तेजी से इस्तेमाल करते हैं, लेकिन उन्हें भी तोड़ दिया जाता है, कुंजी यह सुनिश्चित करने के लिए थी कि आप हेडरों में आगे वर्ग की घोषणाओं का उपयोग करें, फिर। फ़ाइल में "* -Swift.h" फ़ाइल आयात करें।