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


260

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

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

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

    //MainMenu.m

    #import "myProjectModule-Swift.h" //Error: 'myProjectModule-Swift.h' file not found

    @implementation MainMenu

यहाँ मेरी FBManager.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
    }
}

27
YourProjectName-Swift.hएक जादुई हेडर फ़ाइल होनी चाहिए जिसे Xcode स्वचालित रूप से संकलन के दौरान आपके लिए बनाता है (आप वास्तव में इसे प्रोजेक्ट ब्राउज़र में नहीं देखेंगे)। आपके द्वारा बनाए गए को हटाने का प्रयास करें, और #import YourProjectName-Swift.hउन फ़ाइलों को जोड़ें जिनमें आप स्विफ्ट कक्षाओं का उपयोग करना चाहते हैं।
ग्रेग

3
क्या आपका ऐप जिसे आप बना रहे हैं उसे कहा जाता है myProjectModule? -Swift.hफ़ाइल अपने अनुप्रयोग नाम के साथ शुरू करना चाहिए। क्या आपके पास कोई फ़ाइल समाप्त हो रही है -Bridging-Header.h? तुम्हे करना चाहिए। यदि हां, तो उस फ़ाइल का पहला भाग आपके प्रोजेक्ट का नाम है। उस फ़ाइल नाम के पहले भाग को साथ मिलाएं -Swift.hऔर आपको इसमें शामिल होना चाहिए।
टीकामा

4
मेरे पास यह सफलतापूर्वक अपने प्रोजेक्ट में काम कर रहा है, और अभी तक -Swift.hमेरे मैक पर पाए जाने के लिए कोई वास्तविक फ़ाइल समाप्त नहीं हुई है, और फिर भी मैं इसे शामिल कर सकता हूं। तो ऐसी फाइल की तलाश में मत उलझो। बस सुनिश्चित करें कि आप इसे सही ढंग से नाम दे रहे हैं।
टीकामा

2
@vacawama ध्यान दें कि आप आयात पर कमांड-क्लिक करके ऑब्जेक्टिव-सी फ़ाइल में आयात विवरण जोड़ने के बाद सामग्री देख सकते हैं जैसे कि आप किसी अन्य हेडर फ़ाइल पर जा रहे थे।
केंडल हेल्मसटेटर गेलनर

4
मुझे #import <MyProjectName/MyProjectName-Swift.h>
ओलिवर पियरमैन जू

जवाबों:


516

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

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

  1. नई *.swiftफ़ाइल बनाएं (Xcode में) या फाइंडर का उपयोग करके इसे जोड़ें।
  2. एक Objective-C bridging headerबार बनाएं जब Xcode आपसे उस बारे में पूछता है।
  3. अपने स्विफ्ट वर्ग को लागू करें:

    import Foundation
    
    // use @objc or @objcMembers annotation if necessary
    class Foo {
        //..
    }
  4. बिल्ड सेटिंग्स खोलें और इन मापदंडों की जाँच करें:

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

      एक खोज बार में कॉपी और पेस्ट पैरामीटर नाम

    • उत्पाद मॉड्यूल का नाम: myproject

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

    • उद्देश्य-सी संगतता हैडर स्थापित करें: YES

      एक बार जब आप *.swiftप्रोजेक्ट में फ़ाइल जोड़ लेते हैं, तो यह गुण बिल्ड सेटिंग्स में दिखाई देगा

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

      यह शीर्ष लेख Xcode द्वारा स्वतः उत्पन्न होता है

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

    #import "myproject-Swift.h"

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

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

2
क्या किसी ने दस्तावेज़ीकरण में आवश्यक कॉन्फ़िगरेशन (मेरे लिए कम से कम) का उल्लेख देखा है: ऊपर चरण 4 में डेवलपर .apple.com/library/prerelease/ios/documentation/Swift/…? अगर यह मुझे याद आती है। साभार @sig
मॉर्कॉम

2
मेरी समस्या बहुत सरल थी - मुझे फ़ाइल नहीं मिल रही थी "myproject-Swift.h"इसलिए मुझे ऐसा लगता है कि यह काम नहीं कर रहा है। जाहिर है, यह फ़ाइल प्रोजेक्ट नेविगेटर में दिखाई नहीं देती है।
आसफ

6
@Asaf वास्तव में, हाँ, यह फ़ाइल Xcode द्वारा ऑटो-जेनेटिंग है और आपके प्रोजेक्ट बिल्ड-पथ में पता लगा रही है। तो, आप इस फाइल को फाइंडर / कंसोल में मैन्युअल रूप से पा सकते हैं या इसे Ccode + LeftClick पर प्रयोग करके सीधे Xcode में खोल सकते हैं #import "myproject-Swift.h"
sig

1
मेरे लिए # 5 समस्या को ठीक करने के लिए पर्याप्त था !!
Skywinder

12
अपने उन 4 घंटों के साथ, आपने हमारे सौ घंटे बचाए, बहुत बहुत धन्यवाद :) मेरे पसंदीदा में सहेजा गया;)
अबोएटएफ़

65

हेडर फ़ाइल को स्वयं न बनाएं। आपके द्वारा बनाए गए को हटाएं।

सुनिश्चित करें कि आपकी स्विफ्ट कक्षाओं को @objcउस वर्ग से टैग किया गया है या उसके उत्तराधिकारी हैं जो (प्रत्यक्ष या अप्रत्यक्ष रूप से) व्युत्पन्न हैं NSObject

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


8
बिल्ड-सक्षम होना मेरे लिए महत्वपूर्ण था। निर्माण नहीं कर सका क्योंकि यह मेरी -swift.h फ़ाइल नहीं ढूँढ सका, लेकिन यह मेरी -swift.h फ़ाइल नहीं ढूँढ सका क्योंकि यह निर्माण नहीं कर सका: /
anders

13
@anders उस चक्र में फंसते समय, आप यह find ~/library/Developer/Xcode/DerivedData/ -name "*-Swift.h"|xargs basename|sort -uदेखने के लिए उपयोग कर सकते हैं कि क्या फ़ाइल मेरे जैसे ही एक अप्रत्याशित नाम के साथ बनाई गई थी। :)
कोडरिन

38

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

@objc class YourSwiftClassName: UIViewController

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

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

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

#import "YourProjectName-Swift.h" 

Boooom!


1
धन्यवाद, यह काल्पनिक रूप से सरल था और मेरी समस्या को हल कर दिया।
फेलिप

मुझे बिल्ड सेटिंग्स (Xcode 7.3.1) में इनमें से कोई भी विकल्प दिखाई नहीं देता है। मुझे क्या करना चाहिए?
इस्दुदेउल

1
^ से स्विच था Basicकरने के लिए Allशीर्ष पट्टी में।
iosdude

1
Embedded Content Contains SwiftAlways Embed Swift Standard LibrariesXcode 8 के साथ बदल दिया गया था : stackoverflow.com/questions/38792650/…
विलियम ग्रांड

@WilliamGrand सुझाव के लिए धन्यवाद, उत्तर अपडेट किया गया।
भारत मोदी 4

28

संभवत : फ्रेमवर्क लक्ष्य वाले लोगों के लिए भी आपके लिए उपयोगी :

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

#import <ProductName/ProductModuleName-Swift.h>

के बजाय

#import "ProductModuleName-Swift.h"

फ्रेम लक्ष्य के लिए मिक्स एंड मैच पर सेब प्रलेखन के अनुसार ।


1
@ दिनेशर्जनी खुशी मैं मदद कर सकता था! :)
जेहुत

बंडल लक्ष्य के बारे में क्या?
इयूलियन ओनोफ्रेई

14

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

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


14

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

कार्य:

  1. वस्तुनिष्ठ-सी कक्षा में स्विम एनम का उपयोग करें
  2. स्विफ्ट क्लास में ऑब्जेक्टिव-सी एनम का उपयोग करें

पूरा नमूना

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

ऑब्जेक्टिव-सी कोड में स्विफ्ट कोड का पता लगाएं

अपने नमूने में मैं Objective-C में Swift कोड का पता लगाने के लिए SwiftCode.h का उपयोग करता हूं। यह फ़ाइल स्वतः उत्पन्न होती है (मैंने किसी प्रोजेक्ट में इस हेडर फ़ाइल की भौतिक प्रतिलिपि नहीं बनाई है), और आप केवल इस फ़ाइल का नाम सेट कर सकते हैं:

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

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

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

2. स्विफ्ट क्लास जो ऑब्जेक्टिव-सी एनम का उपयोग करती है

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 में ऑब्जेक्टिव-सी फ़ाइल आपको ब्राइडिंग हेडर बनाने का सुझाव देंगे।

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

आप शीर्षक फ़ाइल का नाम यहाँ बदल सकते हैं:

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

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

#import "ObjcClass.h"

प्रयोग

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

परिणाम

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


अधिक नमूने

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

3. ऑब्जेक्टिव-सी कोड से स्विफ्ट क्लास को कॉल करें

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

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. ऑब्जेक्टिव-सी कोड में स्विफ्ट एक्सटेंशन का उपयोग करें

स्विफ्ट का विस्तार

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()

ये नमूने वास्तव में सहायक हैं, धन्यवाद! और स्विफ्ट 4+ के लिए, हमें @objcMembersकक्षा के सामने जोड़ना होगा । क्योंकि @objcअनुकूलन उद्देश्य के लिए स्विफ्ट 4 में अनुमान कम कर दिए गए हैं। उदाहरण के लिए, NSObject-व्युत्पन्न वर्ग के भीतर एक संपत्ति, डिफ़ॉल्ट रूप से @objc का अनुमान नहीं लगाएगी (जैसा कि स्विफ्ट 3 में किया था)। इस उत्तर से मुझे यह बुद्धि मिली ।
हॉस्टलियन

11

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


10
मैं एक मूर्ख हूँ। मैं क्लास का नाम जोड़ रहा था और फिर "-Swift" को जोड़ रहा था। यह "मॉड्यूल" नाम निकला। मुझे यह एहसास कराने के लिए +1।
HotFudgeSunday 16

2
एक और मूर्ख यहाँ जिसने सोचा कि यह वर्ग का नाम था!
चार्ली मार्टिन

9

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

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


1
इससे मेरी समस्या भी हल हो गई। मेरी .m फ़ाइल में मैं इस तरह से फ़ाइल आयात करता #import "my_project-Swift.h" हूँ और मेरा वास्तविक प्रोजेक्ट नाम हैmy-project
Bhavin_m

ध्यान दें- सिर्फ "नहीं।" "-" रिक्त स्थान :(
उपयोगकर्ता 1105951

8

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

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


सिर के लिए धन्यवाद, दोस्त।
फेलिप

इस जवाब ने मेरी मदद की और मेरा दिन बच गया। Xcode की तुलना में महत्वपूर्ण बात यह है कि यह स्वचालित रूप से उत्पन्न होता है और यह HIDDEN फ़ाइल है। मैं खुद "myProject-Swift.h" बना रहा था और यह काम नहीं कर रहा था।
C0mrade

5

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

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

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


1
यह भी एक उपयोगी लिंक: ericasadun.com/2014/08/21/…
डेरियस मिलियास्कस

1
धन्यवाद थैंक्यू थैंक्स बहुत बहुत @DariusMiliauskas केवल इसे अपने लिंक के साथ काम कर रहा है
a4arpan

1
@ डारियसमिलियाकुस्कन्स्ट बहुत कुछ! 5 बिंदु भी पुराने Xcode परियोजना में मेरे लिए समस्या हल
tatiana_c

Define Modulesहोना चाहिए No??
सुनील चौहान


5

दो शर्त है,

  • ऑब्जेक्टिव c फाइल में अपनी स्विफ्ट फाइल का उपयोग करें।
  • स्विफ्ट फ़ाइल में अपने ऑब्जेक्टिव c फाइल का उपयोग करें।

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

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

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

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

ऑब्जेक्टिव c फाइल में अपनी स्विफ्ट फाइल का उपयोग करें।

उस स्थिति में, पहले अपनी कक्षा में स्विफ्ट फ़ाइल में "@objc" लिखें।

उसके बाद, अपने उद्देश्य c फ़ाइल में, यह लिखें,

  #import "YourProjectName-Swift.h"

स्विफ्ट फ़ाइल में अपने ऑब्जेक्टिव c फाइल का उपयोग करें।

उस स्थिति में, अपनी शीर्ष लेख फ़ाइल में, यह लिखें,

  #import "YourObjective-c_FileName.h"

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


4

स्विफ्ट 5 के लिए:

  1. जोड़े @objcअपने वर्ग और तरीकों के लिए कीवर्ड
  2. publicअपनी कक्षा और विधियों में कीवर्ड जोड़ें
  3. अपनी कक्षा को विरासत में दें NSObject
  4. प्रोजेक्ट बनाएं
  5. रखो #import "MyProject-Swift.h"अपने ऑब्जेक्टिव-सी फाइल में

    @objc
    public class MyClass: NSObject {
    
        @objc
        public func myMethod() {
    
        }
    }

एक ही स्विफ्ट 4 के लिए - "@objc कीवर्ड अपने वर्ग और तरीकों में जोड़ें"
करज़िस्तोफ Skrzynecki

3

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

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

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

import UIKit

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

2

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


@ <विशिष्ट वर्ग>; परिभाषित किया जाना चाहिए, और फिर परियोजना का उपयोग उन फ़ाइलों को देखेंगे।
निकिता

2

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

आशा है कि यह किसी की मदद करता है।


मैंने मंचन और उत्पादन के लिए विभिन्न लक्ष्यों के साथ इसे पूरी तरह से अनदेखा कर दिया। आपके उत्तर के लिए धन्यवाद!
बेंजामिन मार्टिन

"संलग्न" का क्या अर्थ है?
इयूलियन ओनोफ्रेई

"संलग्न" = "सदस्य", उन्हें लक्षित सदस्यों के रूप में सूचीबद्ध किया जाना चाहिए
Dani.Rangelov

1

मेरी समस्या मैं xcode पुल फ़ाइल बनाने के बाद अटक गया था, लेकिन फिर भी मुझे हेडर फ़ाइल नाम MYPROJECTNAME-स्विफ्ट में त्रुटि मिली।

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

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

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

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

1

जब आप प्रोजेक्ट में नई स्विफ्ट फाइलें जोड़ते हैं, तो कृपया सुनिश्चित करें कि आप उन्हें सही लक्ष्यों के लिए जोड़ते हैं। कृपया, सुनिश्चित करें कि आप जिस प्रत्येक स्विफ्ट फ़ाइल का उपयोग करने जा रहे हैं, वह NSObject श्रेणी का उपयोग करने वाली है और विकल्प ALWAYS_EMBED_SWIFT_STERARD_LIBRARIES के तहत बिल्ड सेटिंग्स के अंदर @ObjCMembers चेंज के साथ एनोटेट किया गया है। विकल्प DEFINES_MODULE के अंतर्गत बिल्ड सेटिंग्स के अंदर हां में बदलें।


0

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


0

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


0

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

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


0

मुझे बिल्ड में कोई सेटिंग नहीं बदलनी थी और न ही क्लास में @obj जोड़ना था।

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

आयात "बेडटाइम-स्विफ्ट.एच" <- उद्देश्य-सी फ़ाइल के अंदर जिसे उस स्विफ्ट फ़ाइल का उपयोग करने की आवश्यकता है।


0

ठीक है, सभी टिप्पणियों को पढ़ने और पढ़ने और फिर से पढ़ने और फिर से कोशिश करने के बाद, मैंने स्विफ्ट कक्षाओं को अपने बिग ओज-सी परियोजना में शामिल करने में कामयाब रहा। तो, सभी मदद के लिए धन्यवाद। मैं एक टिप साझा करना चाहता था जिससे मुझे प्रक्रिया को बेहतर ढंग से समझने में मदद मिली। .M वर्ग में, स्विफ्ट लक्ष्य नाम #import "myTargetName-Swift.h" की आयात पंक्ति पर गया और कुंजी पर क्लिक किया:

कमांड + माउस क्लिक -> परिभाषा पर जाएं यहां छवि विवरण दर्ज करें

वहां आप स्विफ्ट से लेकर obj-c तक के सभी अनुवाद देख सकते हैं और वहाँ आपको obj-c में पुनः घोषित विभिन्न कार्य मिलेंगे। आशा है कि यह टिप आपकी उतनी ही मदद करेगी जितनी इसने मेरी मदद की।


0

उद्देश्य-सी में स्विफ्ट कक्षाओं का उपयोग करना

यदि आप किसी ऐप टारगेट (एक प्रोजेक्ट में मिक्सिंग ऑब्जेक्टिव-सी और स्विफ्ट) के भीतर कोड आयात करने जा रहे हैं, तो आपको #import "<#YourProjectName#>-Swift.h"स्विफ्ट कोड को ऑब्जेक्टिव-सी कोड [मिक्सिंग स्विफ्ट और ऑब्जेक्टिव-सी कोड को एक प्रोजेक्ट में एक्सपोज करने के लिए] अगली इंपोर्ट लाइन का उपयोग करना चाहिए ]

इस पोस्ट में मैं बताऊंगा कि स्विफ्ट स्टैटिक लाइब्रेरी को ऑब्जेक्टिव-सी कोड में कैसे आयात किया जाए

उद्देश्य-सी उपभोक्ता -> स्टेटिक लाइब्रेरी स्विफ्ट

Xcode संस्करण 10.2.1

स्थिर पुस्तकालय बनाएँ

Create Swift static libraryअगले परिवर्धन के साथ पालन ​​करें :

स्विफ्ट एपीआई को उजागर करें। उद्देश्य-सी [के बारे में] से स्विफ्ट के कार्यों का उपयोग करने के लिए

निर्माण के बाद आपको एक <product_name>-Swift.hफ़ाइल मिलनी चाहिए जिसे [फ़ाइल नहीं मिली] में स्थित होना चाहिएDerivedSources

उद्देश्य-सी उपभोक्ता स्विफ्ट स्टैटिक लाइब्रेरी के साथ

Drag and dropXcode परियोजना में द्विआधारी [के बारे में]

Link Library[अपरिभाषित प्रतीक] [लिंक बनाम एम्बेड करें]

Project editor -> select a target -> General -> Linked Frameworks and Libraries -> add -> Add Others... -> point to `lib<product_name>.a` file
//or
Project editor -> select a target -> Build Phases -> Link Binary With Libraries -> add -> Add Others... -> point to `lib<product_name>.a` file

जोड़ें Library Search paths[लाइब्रेरी के लिए नहीं मिला] [रिकर्सिव पथ]

Project editor -> select a target -> Build Settings -> Search Paths -> Library Search paths -> add path to the parent of `lib<product_name>.a` file

जोड़े Header Search Paths[मॉड्यूल नहीं मिला] [रिकर्सिव पथ]

Project editor -> select a target -> Build Settings -> Search Paths -> Header Search Paths -> add path to generated `<product_name>-Swift.h` file 

.swift fileउद्देश्य-सी परियोजना के लिए खाली जोड़ें । [अपरिभाषित प्रतीक] जब Xcode प्रेस क्रिएट Bridging Header(यह बनाएगा module_name-Bridging-Header.h) पूछेगा और इस फ़ाइल में एक पथ सेटअप करेगा

Project editor -> select a target -> Build Settings -> Swift Compiler - General -> Objective-C Bridging Header

उद्देश्य-सी ग्राहक कोड के लिए मॉड्यूल आयात करें [फ़ाइल नहीं मिली] [मॉड्यूल_नाम]

#import "module_name-Swift.h"

अधिक उदाहरण यहाँ


0

XCode 11.3.1:

जब मैं एक objc कोड में एक स्विफ्ट इनर क्लास का उपयोग करना चाहता हूं, तो यह "अपरिभाषित प्रतीक" (आंतरिक वर्ग और बाहरी वर्ग को परेशान करने के लिए) के लिए संकलित नहीं करता है, मैंने उत्पन्न "-swift.h" हेडर और दोनों वर्गों की जाँच की। वहाँ।

घंटों की कोशिश करने के बाद मैंने आंतरिक वर्ग को एक सामान्य वर्ग में बदल दिया और इसे संकलित किया।

मैं परियोजना को साफ करता हूं, DerivedData फ़ोल्डर को हटाता हूं और यह संकलित करता है।


1
क्या आपने @objcआंतरिक वर्ग की घोषणा से पहले जोड़ने की कोशिश की ?
dnnagy

धन्यवाद @dnnagy, जाँच की कि यह वाक्यविन्यास मुद्दा नहीं है।
बिल चैन

-1

ऊपर सब कुछ करने के बाद भी मुझे त्रुटियाँ मिलीं। मेरी समस्या समाप्त हो गई कि स्विफ्ट फाइलें जो मुझे चाहिए थीं, वे किसी कारण से बंडल संसाधनों में नहीं जोड़ी गईं।

मैंने इसे [MyTarget]> बिल्ड चरण> कॉपी बंडल संसाधन पर जाकर तय किया, फिर प्लस बटन पर क्लिक किया और स्विफ्ट फ़ाइलों को जोड़ा।


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