অবজেক্টিভ-সি এর মধ্যে সুইফ্ট ক্লাস ব্যবহার করতে পারবেন না


260

আমি Swiftআমার অ্যাপটিতে কোড সংহত করার চেষ্টা করি y আমার অ্যাপটি লিখিত আছে Objective-Cএবং আমি একটি Swiftক্লাস যুক্ত করেছি। আমি এখানে বর্ণিত সমস্ত কিছু করেছি । তবে আমার সমস্যাটি হ'ল ফাইলটি Xcodeতৈরি করেনি -Swift.h, কেবল ব্রিজিং শিরোনাম। সুতরাং আমি এটি তৈরি করেছি, তবে এটি আসলে খালি। আমি সুইফটে আমার সমস্ত ওবিজেসি ক্লাস ব্যবহার করতে পারি, তবে আমি এটি বিপরীতে করতে পারি না। আমি আমার সুইফ্ট ক্লাসটি চিহ্নিত করেছি @objcতবে তাতে কোনও লাভ হয়নি। আমি এখন কি করব?

সম্পাদনা: অ্যাপল বলেছেন: "আপনি যখন সুইফট কোডটি উদ্দেশ্য-সি-তে আমদানি করেন, তখন আপনি 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.hXCode স্বয়ংক্রিয়ভাবে সংকলনের সময় আপনার জন্য তৈরি করার জন্য একটি জাদুকরী শিরোনাম ফাইল হওয়া উচিত (আপনি আসলে এটি প্রকল্প ব্রাউজারে দেখতে পাবেন না)। আপনি যেটি তৈরি করেছেন সেটিকে মুছে ফেলার চেষ্টা করুন এবং #import YourProjectName-Swift.hআপনি যে ফাইলগুলিতে সুইফ্ট ক্লাসগুলি ব্যবহার করতে চান তাতে যুক্ত করুন।
গ্রেগ

3
আপনার অ্যাপটি কি আপনি বিল্ডিং করছেন myProjectModule? -Swift.hফাইলটি আপনার অ্যাপের নাম দিয়ে শুরু করা উচিত নয়। আপনার কি কোনও ফাইল শেষ হচ্ছে -Bridging-Header.h? তোমার উচিত. যদি তা হয় তবে এই ফাইলটির প্রথম অংশটি আপনার প্রকল্পের নাম। সেই ফাইলের নামের প্রথম অংশটি একত্রিত করুন -Swift.hএবং এটি আপনাকে অন্তর্ভুক্ত করা উচিত।
ওয়াকওমা

4
আমার প্রকল্পটিতে এটি সফলভাবে কাজ করছে এবং এখনও -Swift.hআমার ম্যাকের সন্ধানের জন্য কোনও আসল ফাইল নেই এবং আমি এটি অন্তর্ভুক্ত করতে পারি। সুতরাং এই জাতীয় একটি ফাইল সন্ধান করতে ঝুলবেন না। কেবলমাত্র আপনি এটির নামকরণ করছেন তা নিশ্চিত করুন।
ওয়াকওমা

2
@ ভাকাওয়ামা নোট করুন যে আপনি আমদানি বিবরণীটি কোনও উদ্দেশ্য-সি ফাইলের সাথে আমদানিতে কমান্ড-ক্লিক করে যুক্ত করার পরে বিষয়বস্তুগুলি দেখতে পাবেন যেন আপনি অন্য কোনও শিরোলেখ ফাইলটি ভিজিট করছেন।
কেনডাল হেলস্টেটার জেলনার

4
আমাকে ব্যবহার করতে হয়েছিল#import <MyProjectName/MyProjectName-Swift.h>
অলিভার পিয়ারমাইন

উত্তর:


516

আমি Swiftআমার Xcodeউদ্দেশ্য-সি ভিত্তিক প্রকল্পটি সক্ষম করতে প্রায় 4 ঘন্টা ব্যয় করেছি । আমার myproject-Swift.hফাইলটি সফলভাবে তৈরি করা হয়েছিল, তবে আমারটি Xcodeদেখেনি Swift-classes। সুতরাং, আমি একটি নতুন Xcodeওবজক ভিত্তিক প্রকল্প তৈরি করার সিদ্ধান্ত নিয়েছি এবং শেষ পর্যন্ত, আমি সঠিক উত্তরটি পেয়েছি! আশা করি এই পোস্টটি কাউকে সহায়তা করবে :-)

Xcode Objc- ভিত্তিক প্রকল্পের জন্য ধাপে ধাপে সুইফ্ট সংহতকরণ:

  1. নতুন *.swiftফাইল তৈরি করুন (এক্সকোডে) বা ফাইন্ডার ব্যবহার করে এটি যুক্ত করুন।
  2. Objective-C bridging headerএক্সকোড আপনাকে সে সম্পর্কে জিজ্ঞাসা করলে একটি তৈরি করুন ।
  3. আপনার সুইফ্ট শ্রেণি প্রয়োগ করুন:

    import Foundation
    
    // use @objc or @objcMembers annotation if necessary
    class Foo {
        //..
    }
  4. বিল্ড সেটিংস খুলুন এবং এই পরামিতিগুলি পরীক্ষা করুন:

    • মডিউল সংজ্ঞা দেয়: YES

      অনুসন্ধান বারে প্যারামিটারের নাম অনুলিপি করুন এবং আটকান

    • পণ্যের মডিউল নাম: myproject

      আপনার পণ্য মডিউল নামটিতে কোনও বিশেষ অক্ষর না রয়েছে তা নিশ্চিত করুন

    • উদ্দেশ্য-সি সামঞ্জস্যতা শিরোনাম ইনস্টল করুন: YES

      আপনি একবার *.swiftএই প্রকল্পে ফাইল যুক্ত করলে এই সম্পত্তি বিল্ড সেটিংসে উপস্থিত হবে

    • উদ্দেশ্য-সি উত্পন্ন ইন্টারফেস শিরোনাম: myproject-Swift.h

      এই শিরোনামটি এক্সকোড দ্বারা স্বয়ংক্রিয়ভাবে উত্পাদিত

    • উদ্দেশ্য-সি ব্রিজিং শিরোনাম: $(SRCROOT)/myproject-Bridging-Header.h
  5. আপনার * .m ফাইলে সুইফট ইন্টারফেস শিরোনাম আমদানি করুন।

    #import "myproject-Swift.h"

    ত্রুটি এবং সতর্কতাগুলিতে মনোযোগ দিন না।

  6. আপনার এক্সকোড প্রকল্পটি পরিষ্কার এবং পুনর্নির্মাণ করুন।
  7. লাভ!

2
: যেকেউ কনফিগারেশন এ প্রয়োজন (অন্তত আমার জন্য) ডকুমেন্টেশনে উল্লেখ দেখা হয়েছে developer.apple.com/library/prerelease/ios/documentation/Swift/... উপরে পদক্ষেপ 4? যদি তা হয় তবে আমি এটি মিস করি। ধন্যবাদ @ সিগ
মোরক্রোম

2
আমার সমস্যাটি অনেক সহজ ছিল - আমি ফাইলটি খুঁজে পেলাম না "myproject-Swift.h"বলে মনে হচ্ছে এটি কাজ করছে না। স্পষ্টতই, এই ফাইলটি প্রকল্প নেভিগেটরে দৃশ্যমান নয়।
আসফ

6
@ আসফ প্রকৃতপক্ষে, হ্যাঁ, এই ফাইলটি এক্সকোড দ্বারা স্বয়ংক্রিয়ভাবে উত্পন্ন করছে এবং আপনার প্রকল্পের বিল্ড-পাথের মধ্যে রয়েছে। সুতরাং, আপনি এই ফাইলটি ফাইন্ডার / কনসোলে ম্যানুয়ালি খুঁজে পেতে পারেন বা সিএমডি + বাম ক্লিক ক্লিক করে সরাসরি এক্সকোডে এটি খুলতে পারেন #import "myproject-Swift.h"
সিগ

1
আমার হিসাবে # 5 সমস্যা সমাধানের জন্য যথেষ্ট ছিল !!
স্কাইওয়ান্দার

12
আপনার এই 4 ঘন্টা সহ, আপনি আমাদের ঘন্টা কয়েকটি সঞ্চয় করেছেন, অনেক ধন্যবাদ :) আমার প্রিয়তে সংরক্ষিত হয়েছে;)
Abo3atef

65

হেডার ফাইলটি নিজে তৈরি করবেন না। আপনার তৈরি করা একটি মুছুন।

নিশ্চিত হয়ে নিন যে আপনার সুইফ্ট ক্লাসগুলি এমন শ্রেণীর সাথে ট্যাগ হয়েছে @objcবা উত্তরাধিকার সূত্রে প্রাপ্ত হয়েছে (প্রত্যক্ষ বা পরোক্ষভাবে) থেকে প্রাপ্ত NSObject

আপনার প্রকল্পে কোনও সংকলক ত্রুটি থাকলে Xcode ফাইলটি উত্পন্ন করবে না - নিশ্চিত করুন যে আপনার প্রকল্পটি পরিষ্কারভাবে তৈরি করেছে।


8
বিল্ড-সক্ষম হওয়া আমার পক্ষে চাবিকাঠি। এটি তৈরি করতে পারেনি কারণ এটি আমার-সুইচ.এইচ ফাইলটি খুঁজে পায়নি, তবে এটি আমার -উইউএসইফ ফাইলটি খুঁজে পায়নি কারণ এটি তৈরি করতে পারেনি: /
এন্ডার্স

13
@ চ্যানেলটি যখন আটকে পড়েছিল তখন আপনি find ~/library/Developer/Xcode/DerivedData/ -name "*-Swift.h"|xargs basename|sort -uএই ফাইলটি আমার জন্য যেমন অপ্রত্যাশিত নাম দিয়ে তৈরি করা হয়েছে তা দেখতে ব্যবহার করতে পারেন। :)
কোডারিপার

38

এক্সকোডকে এর কাজটি করার অনুমতি দিন, ম্যানুয়ালি সুইফ্ট শিরোনাম যুক্ত / তৈরি করবেন না। আপনার সুইফ্ট ক্লাস প্রাক্তন হওয়ার আগে @objc যুক্ত করুন।

@objc class YourSwiftClassName: UIViewController

আপনার প্রকল্প সেটিংয়ে নীচের পতাকাগুলির জন্য অনুসন্ধান করুন এবং এটি হ্যাঁ পরিবর্তন করুন (প্রকল্প এবং লক্ষ্য উভয়)

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

তারপরে প্রকল্পটি পরিষ্কার করুন এবং একবার বিল্ড সাফল্যের পরে (এটি সম্ভবত হওয়া উচিত) আপনার উদ্দেশ্য-সি ক্লাসে এমডি ফাইলের শিরোনাম ফাইলের নীচে আমদানি করুন

#import "YourProjectName-Swift.h" 

Boooom!


1
ধন্যবাদ, এটি চমত্কারভাবে সহজ ছিল এবং আমার সমস্যার সমাধান করেছে।
ফিলিপ

আমি বিল্ড সেটিংসে এই বিকল্পগুলির কোনওটিই দেখতে পাচ্ছি না (এক্সকোড 7.3.1)। আমার কি করা উচিৎ?
আইওসডুড

1
The উপরের বারে থেকে স্যুইচ Basicকরতে Allহয়েছিল।
iosdude

1
Embedded Content Contains SwiftAlways Embed Swift Standard Librariesএক্সকোড 8 দিয়ে পরিবর্তিত হয়েছিল : স্ট্যাকওভারফ্লো.com
উইলিয়াম গ্র্যান্ড

@ উইলিয়ামগ্র্যান্ড এই পরামর্শের জন্য ধন্যবাদ, উত্তরটি আপডেট করেছে।
ভারত মোদি

28

ফ্রেমওয়ার্ক টার্গেটযুক্ত আপনার জন্য সম্ভবত এটি সহায়ক :

ইম্পোর্ট বিবৃতিটি স্বয়ংক্রিয়ভাবে তৈরি হেডার ফাইলের দেখায় একটু ভিন্ন অ্যাপ্লিকেশন লক্ষ্যমাত্রা থেকে। অন্যান্য উত্তর ব্যবহার উল্লিখিত অন্যান্য জিনিস ছাড়াও

#import <ProductName/ProductModuleName-Swift.h>

পরিবর্তে

#import "ProductModuleName-Swift.h"

কাঠামোগত লক্ষ্যগুলির জন্য মিক্স এবং ম্যাচে আপেল নথিপত্র অনুসারে ।


1
@ দিনেশারজানি খুশি আমি সাহায্য করতে পারি! :)
Jeehut

বান্ডিল লক্ষ্য সম্পর্কে কি?
Iulian Onofrei

14

আপনার প্রকল্পটি একটি মডিউল সংজ্ঞায়িত করেছে এবং আপনি মডিউলটিকে একটি নাম দিয়েছেন তা নিশ্চিত করুন। তারপরে পুনর্নির্মাণ করুন এবং এক্সকোড -Swift.hশিরোনাম ফাইলটি তৈরি করবে এবং আপনি আমদানি করতে সক্ষম হবেন।

আপনি আপনার প্রকল্প সেটিংসে মডিউল সংজ্ঞা এবং মডিউল নাম সেট করতে পারেন।


14

বিশদ: এক্সকোড 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

উদ্দেশ্য-সি কোডে সুইফট কোডটি সনাক্ত করুন

আমার নমুনায় আমি উদ্দেশ্য-সি-তে সুইফট কোড সনাক্ত করতে সুইফটকোড.হ ব্যবহার করি। এই ফাইলটি স্বয়ংক্রিয়ভাবে উত্পন্ন হয় (আমি কোনও প্রকল্পে এই শিরোলেখের ফাইলটির একটি দৈহিক অনুলিপি তৈরি করি নি) এবং আপনি কেবল এই ফাইলটির নাম সেট করতে পারেন:

এখানে চিত্র বর্ণনা লিখুন

এখানে চিত্র বর্ণনা লিখুন

যদি সংকলকটি আপনার শিরোনামের ফাইল সুইফট কোডটি খুঁজে না পায় তবে প্রকল্পটি সংকলনের চেষ্টা করুন।

২. সুইফ্ট ক্লাস যা অবজেক্টিভ-সি এনাম ব্যবহার করে

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
        }
        
    }
}

সুইফ্ট কোডে উদ্দেশ্য-সি কোড সনাক্ত করুন

ব্রিজিং হেডার ফাইলটি তৈরি করতে হবে। আপনি যখন উদ্দেশ্য-সি প্রকল্পে সুইফ্ট ফাইল যুক্ত করবেন বা সুইফ্ট প্রকল্পে কোড অব সিজেড এক্সকোড আপনাকে ব্রিজিং শিরোলেখ তৈরি করার পরামর্শ দেবে।

এখানে চিত্র বর্ণনা লিখুন

আপনি এখানে ব্রিজিং হেডার ফাইলের নাম পরিবর্তন করতে পারেন:

এখানে চিত্র বর্ণনা লিখুন

গণনার জমকালো অনুষ্ঠান-Header.h

#import "ObjcClass.h"

ব্যবহার

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

ফলাফল

এখানে চিত্র বর্ণনা লিখুন


আরও নমুনা

সম্পূর্ণ ইন্টিগ্রেশন পদক্ষেপগুলি উদ্দেশ্য-সি এবং উপরে বর্ণিত সুইফট । এখন আমি অন্য কিছু কোড উদাহরণ লিখব।

অবজেক্টিভ-সি কোড থেকে সুইফ্ট ক্লাসে কল করুন

সুইফ্ট ক্লাস

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!!!";

ফলাফল

এখানে চিত্র বর্ণনা লিখুন

৪. সুইফ্ট কোড থেকে উদ্দেশ্য-সি শ্রেণিতে কল করুন class

উদ্দেশ্য-সি শ্রেণি (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];

Sw. সুইফট কোডে অবজেক্টিভ-সি এক্সটেনশন ব্যবহার করুন

অবজেক্টিভ-সি এক্সটেনশান (ইউআইভিউএক্সটেনশন 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-এ অনুমান কমানো হয়েছে। উদাহরণস্বরূপ, একটি এনএসওজেক্ট-উত্পন্ন শ্রেণীর মধ্যে একটি সম্পত্তি, আর ডিফল্টরূপে @objc অনুমান করবে না (এটি সুইফট 3-তে যেমন হয়েছিল)। আমি এই উত্তরটি থেকে এই ইন্টেলটি পেয়েছি ।
হস্টলিয়ন

11

আমার একই সমস্যা ছিল এবং এটি পরিণত হয়েছিল যে মডিউলটির বিশেষ চিহ্নগুলি Xcode দ্বারা প্রতিস্থাপিত হয় (আমার ক্ষেত্রে ড্যাশগুলি আন্ডারস্কোর হয়ে শেষ হয়েছিল)। প্রকল্পের সেটিংসে আপনার প্রকল্পের মডিউলটির নাম জানতে "মডিউল নাম" পরীক্ষা করুন। এর পরে ModuleName-Swift.hসেটিংসে মডিউলটি ব্যবহার বা নামকরণ করুন।


10
আমি মুরন। আমি ক্লাসের নাম যুক্ত করছিলাম এবং তারপরে "-সুইফ্ট" যুক্ত করছিলাম। দেখা যাচ্ছে এটি "মডিউল" নাম। আমাকে এটি উপলব্ধি করার জন্য +1।
হটফজজসুন্দে

2
এখানে আর এক মুরন কে মনে করেছিল এটি ক্লাসের নাম!
চার্লি মার্টিন 4

9

ফাইলটি স্বয়ংক্রিয়ভাবে তৈরি হয় (এখানে এক্সকোড .3.৩.২ সম্পর্কে কথা বলা হচ্ছে)। তবে আপনি এটি দেখতে পাবেন না, কারণ এটি আপনার উত্পন্ন ডেটা ফোল্ডারে রয়েছে। আপনার সুইফ্ট ক্লাসটি চিহ্নিত করে @objc, সংকলন করুন, তারপরে Swift.hআপনার উত্পন্ন ডেটা ফোল্ডারে অনুসন্ধান করুন। আপনার সেখানে সুইফ্ট শিরোনামটি খুঁজে পাওয়া উচিত।

আমার সমস্যা ছিল, এই এক্সকোডটি আমার নাম পরিবর্তন my-Project-Swift.hকরে my_Project-Swift.hএক্সকোডে "." "-"ইত্যাদি চিহ্নগুলি পছন্দ করে না । উপরের পদ্ধতিটির সাহায্যে আপনি ফাইলের নামটি খুঁজে পেতে এবং এটি একটি উদ্দেশ্য-সি শ্রেণিতে আমদানি করতে পারেন।


1
এটিও আমার সমস্যার সমাধান করেছে। আমার .m ফাইলে আমি ফাইলটি এই #import "my_project-Swift.h"my-project
জাতীয়ভাবে

মনোযোগ - শুধু "নয়।" "-" এছাড়াও স্পেস করে :(
ব্যবহারকারী1105951

8

কেবলমাত্র এম। এম বা। এইচ ফাইলে "আমারপ্রজেক্ট-সুইফট।" "অন্তর্ভুক্ত করুন

পিএস আপনি এটি লুকিয়ে থাকা ফাইল ইন্সপেক্টরটিতে "মাইপ্রজেক্ট-সুইফট.h" খুঁজে পাবেন না। তবে এটি স্বয়ংক্রিয়ভাবে অ্যাপের মাধ্যমে উত্পন্ন হয়।


সাথীদের জন্য ধন্যবাদ।
ফিলিপ

এই উত্তরটি আমাকে সাহায্য করেছে এবং আমার দিনকে বাঁচিয়েছে। গুরুত্বপূর্ণ বিষয়টি Xcode এর থেকে স্বয়ংক্রিয়ভাবে উত্পন্ন হচ্ছে এবং এটি ফাইলটি লুকিয়ে রেখেছে than আমি নিজেই "মাইপ্রজেক্ট-সুইফট এইচ" তৈরি করছিলাম এবং এটি কাজ করছে না।
C0mrad

5

@ সিগ উত্তরটি অন্যতম সেরা, তবে এটি পুরানো প্রকল্প (নতুন নয়!) নিয়ে আমার পক্ষে কাজ করে নি, আমার কিছু সংশোধন প্রয়োজন। অনেক পরিবর্তনের পরে আমি আমার জন্য রেসিপিটি খুঁজে পেয়েছি (এক্সকোড 7.2 ব্যবহার করে):

  1. পণ্যের মডিউল নাম: PRODUCT_NAME (PRODUCT_NAME: c99extidentifier)
  2. মডিউল সংজ্ঞায়িত: কোন
  3. এম্বেড থাকা সামগ্রীগুলিতে সুইফট রয়েছে: না
  4. উদ্দেশ্য-সি সামঞ্জস্যতা শিরোনাম ইনস্টল করুন: হ্যাঁ
  5. উদ্দেশ্য-সি ব্রিজিং শিরোনাম: প্রকল্পের নাম-ব্রিজিং-শিরোনাম

শেষ পয়েন্ট (5) অত্যন্ত গুরুত্বপূর্ণ ছিল। আমি এটি কেবল দ্বিতীয় বিভাগে রেখেছি (লক্ষ্য ক্ষেত্র), প্রজেক্ট ক্ষেত্রটি খালি ছেড়ে দেওয়া উচিত: এখানে চিত্র বর্ণনা লিখুনঅন্যথায়, এটি আমার জন্য সঠিক "প্রকল্প-সুইফট.এইচ" ফাইল তৈরি করে নি (এটিতে দ্রুত পদ্ধতিগুলি অন্তর্ভুক্ত হয়নি))


1
এছাড়াও সহায়ক লিঙ্ক: ericasadun.com/2014/08/21/…
দারিয়াস মিলিয়াস্কাস

1
ধন্যবাদ ধন্যবাদ ধন্যবাদ আপনাকে অনেক ধন্যবাদ @ দরিয়াস মিলিয়াউসকাস এটি কেবল আপনার লিঙ্কটি দিয়ে কাজ করতে
পেরেছিল

1
পছন্দ করুন পুরানো এক্সকোড প্রকল্পে আমার জন্য 5 দফার সমস্যার
সমাধানও হয়েছে

Define Modulesহওয়া উচিত No??
সুনীল চৌহান


5

দুটি শর্ত আছে,

  • অবজেক্টিভ সি ফাইলটিতে আপনার সুইফট ফাইলটি ব্যবহার করুন।
  • আপনার উদ্দেশ্য সি ফাইলটি সুইফ্ট ফাইলে ব্যবহার করুন।

সুতরাং, সেই উদ্দেশ্যে, আপনাকে এই পদক্ষেপগুলি অনুসরণ করতে হবে:

  • একটি উদ্দেশ্য-সি প্রকল্প বা তদ্বিপরীত আপনার সুইফ্ট ফাইল যুক্ত করুন।
  • শিরোনাম (.h) ফাইল তৈরি করুন।
  • বিল্ডিং সেটিংসে যান এবং অনুসন্ধানের সাথে নীচের পদক্ষেপগুলি সম্পাদন করুন,

    1. এই ব্রাইডটি "ব্রাইড" সন্ধান করুন এবং আপনার শিরোনাম ফাইলটির একটি পথ নির্ধারণ করুন।
    2. "মডিউলটি সংজ্ঞায়িত করুন": হ্যাঁ।
    3. "সর্বদা এম্বেড স্ট্যান্ডার্ড গ্রন্থাগারগুলি": হ্যাঁ।
    4. "উদ্দেশ্য-সি সামঞ্জস্যতা শিরোনাম ইনস্টল করুন": হ্যাঁ।

এর পরে, আপনার প্রকল্পটি পরিষ্কার করুন এবং পুনর্নির্মাণ করুন।

অবজেক্টিভ সি ফাইলটিতে আপনার সুইফট ফাইলটি ব্যবহার করুন।

সেক্ষেত্রে প্রথমে সুইফ্ট ফাইলে আপনার ক্লাসের আগে "@objc" লিখুন।

এর পরে, আপনার উদ্দেশ্য সি ফাইলটিতে এটি লিখুন,

  #import "YourProjectName-Swift.h"

আপনার উদ্দেশ্য সি ফাইলটি সুইফ্ট ফাইলে ব্যবহার করুন।

সেক্ষেত্রে আপনার হেডার ফাইলটিতে এটি লিখুন,

  #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() {
    
        }
    }

"আপনার ক্লাস এবং পদ্ধতিগুলিতে @objc কীওয়ার্ড যুক্ত করুন" - সুইফট 4
ক্রিজিসটফ স্ক্রাজিনেককি

3

আমার ক্ষেত্রে, এই পদক্ষেপগুলি বাদে:

  1. পণ্যের মডিউল নাম: মাইপ্রজেক্ট
  2. মডিউল সংজ্ঞায়িত: হ্যাঁ
  3. এম্বেড থাকা সামগ্রীটিতে সুইফট রয়েছে: হ্যাঁ
  4. উদ্দেশ্য-সি সামঞ্জস্যতা শিরোনাম ইনস্টল করুন: হ্যাঁ
  5. উদ্দেশ্য-সি ব্রিজিং শিরোলেখ: $ (এসআরক্রট) / উত্স / সুইফট ব্রিজিং।

প্রোডাক্টনাম-সুইফট.চ ফাইল তৈরি করতে আমার ক্লাসটি সর্বজনীন হিসাবে প্রকাশ করা দরকার :

import UIKit

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

2

আমি সবেমাত্র আবিষ্কার করেছি যে কোনও প্রকল্পে সুইফ্ট ফাইলের ডিরেক্টরি যুক্ত করা কাজ করবে না। আপনাকে ডিরেক্টরিটির জন্য প্রথমে একটি গ্রুপ তৈরি করতে হবে, তারপরে সুইফ্ট ফাইলগুলি যুক্ত করুন ...


@ <নির্দিষ্ট শ্রেণি>; সংজ্ঞায়িত করা উচিত, এবং তারপরে ব্যবহার করা প্রকল্পটি সেই ফাইলগুলি দেখতে পাবে।
নিকিতা

2

আমার একই সমস্যা ছিল এবং অবশেষে এটি প্রদর্শিত হয়েছিল যে তারা একই লক্ষ্যগুলির সাথে সংযুক্ত ছিল না। ওবিজেসি ক্লাসটি টার্গেট 1 এবং টার্গেট 2 এর সাথে সংযুক্ত থাকে, সুইফ্ট ক্লাসটি কেবলমাত্র টার্গেট 1 এর সাথে সংযুক্ত থাকে এবং ওবজিসি বর্গের অভ্যন্তরে দৃশ্যমান হয় না।

আশা করি এটি কাউকে সাহায্য করবে।


মঞ্চায়ন ও উত্পাদনের বিভিন্ন লক্ষ্য নিয়ে আমি এটি সম্পূর্ণরূপে উপেক্ষা করেছি। আপনার উত্তর করার জন্য আপনাকে ধন্যবাদ!
বেঞ্জামিন মার্টিন

"সংযুক্ত" অর্থ কী?
আইউলিয়ান ওনোফ্রেই

"সংযুক্ত" = "সদস্য", তাদের লক্ষ্য সদস্য হিসাবে তালিকাভুক্ত করা উচিত
ড্যানি.র্যাঙ্গেলভ

1

আমার সমস্যাটি ছিল যে এক্সকোড সেতুর ফাইল তৈরি করার পরে আমি আটকে গিয়েছিলাম কিন্তু তবুও আমার শিরোনাম ফাইলের নাম MYPROJECTNAME-swift.h এ ত্রুটি পেয়েছি

1.আমি টার্মিনালটিতে যাচাই করি এবং সমস্ত অটো তৈরি সুইফট ব্রিজ ফাইল অনুসন্ধান করি:

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

আপনি কী এক্সকোড তৈরি করেছেন তা দেখুন।

  1. আমার ক্ষেত্রে, আমার প্রকল্পের নামটিতে জায়গা ছিল এবং এক্সকোড প্রতিস্থাপন এটি '_'

1

আপনি যখন প্রকল্পে নতুন সুইফ্ট ফাইল যুক্ত করবেন, দয়া করে নিশ্চিত হয়ে নিন যে আপনি সেগুলি লক্ষ্যগুলি সংশোধন করতে যুক্ত করেছেন। দয়া করে নিশ্চিত হয়ে নিন যে আপনি যে প্রতিটি সুইফট ফাইলটি এনএসওবজেক্ট শ্রেণিতে ব্যবহার করতে যাচ্ছেন এবং ALWAYS_EMBED_SWIFT_STANDARD_LIBRARIES বিকল্পের অধীনে বিল্ড সেটিংসের অভ্যন্তরে @ObjCMembers YES এ পরিবর্তন করুন ann DEFINES_MODULE বিকল্পের অধীনে বিল্ড সেটিংসের অভ্যন্তরে YES এ পরিবর্তন করুন।


0

আমার একই ত্রুটি রয়েছে: myProjectModule-Swift.hফাইলটি পাওয়া যায় নি ", তবে আমার ক্ষেত্রে আসল কারণটি ছিল ভুল স্থাপনার টার্গেটে:" Swiftওএস এক্সে ১০.৯-এর আগে পাওয়া যায় না; দয়া করে MACOSX_DEPLOYMENT_TARGET১০.৯ বা তার পরে সেট করুন (বর্তমানে এটি '10 .7 ') "সুতরাং, যখন আমি যখন মোতায়েনের লক্ষ্য পরিবর্তন করেছি 10.9 - প্রকল্পটি সফলভাবে সংকলিত হয়েছিল।


0

আমার সমস্যাটি ছিল যে -swift.h ফাইলটির স্বয়ংক্রিয় প্রজন্ম কাস্টমডিবুগস্ট্রিংকনভার্টেবলের একটি সাবক্লাস বুঝতে সক্ষম হয় না। আমি ক্লাস পরিবর্তে এনএসবজেক্টের সাবক্লাসে পরিণত হয়েছিল। এর পরে, -swift.h ফাইলটি এখন ক্লাসটি সঠিকভাবে অন্তর্ভুক্ত করেছে।


0

আমার সমস্যা ছিল যে আমি আমার উদ্দেশ্য-সি ব্রিজিং শিরোলেখগুলিতে ক্লাস যুক্ত করব এবং যে উদ্দেশ্য-সি শিরোনাম আমদানি করা হয়েছিল, তারা সুইফ্ট শিরোনামটি আমদানির চেষ্টা করছিল। এটা পছন্দ হয়নি।

সুতরাং আমার সমস্ত অবজেক্টিভি-সি ক্লাসগুলিতে যা সুইফ্ট ব্যবহার করে, তবে সেতুবন্ধিত হয়, কীটি নিশ্চিত করা ছিল যে আপনি শিরোনামগুলিতে ফরোয়ার্ড ক্লাসের ঘোষণাপত্র ব্যবহার করছেন, তারপরে .m ফাইলটিতে "* -Swift.h" ফাইলটি আমদানি করুন।


0

আমাকে বিল্ডে কোনও সেটিংস পরিবর্তন করতে বা ক্লাসে @obj যুক্ত করতে হয়নি।

আমাকে যা করতে হয়েছিল তা হ'ল ব্রিজ-হেডার তৈরি করা যা স্বয়ংক্রিয়ভাবে তৈরি হয়েছিল যখন আমি সুইফ্ট ক্লাসগুলি উদ্দেশ্য-সি প্রকল্পে তৈরি করেছি- এবং তারপরে আমাকে সবেমাত্র করতে হয়েছিল

"বেডটাইম-সুইফট। hd" <আমদানি করুন - উদ্দেশ্য-সি ফাইলের অভ্যন্তরে sw সুইফট ফাইলটি ব্যবহার করা দরকার।


0

ভাল, সমস্ত মন্তব্য পড়ার পরে এবং চেষ্টা এবং পড়ার এবং আবার চেষ্টা করার পরে, আমি আমার বড় আপত্তি-সি প্রকল্পে সুইফ্ট ক্লাসগুলি অন্তর্ভুক্ত করতে সক্ষম হয়েছি। সুতরাং, সমস্ত সহায়তার জন্য ধন্যবাদ। আমি একটি টিপ ভাগ করতে চেয়েছিলাম যা প্রক্রিয়াটি আরও ভালভাবে বুঝতে সহায়তা করে। .M ক্লাসে, সুইফট টার্গেট নাম # মিম্পোর্ট "মাই টার্গেটনাম-সুইফট.h" এর আমদানি লাইনে গিয়ে কীটি ক্লিক করুন:

কমান্ড + মাউস ক্লিক করুন -> সংজ্ঞা যান এখানে চিত্র বর্ণনা লিখুন

সেখানে আপনি অবিজট-সি থেকে দ্রুতগতিতে সমস্ত অনুবাদ দেখতে পাচ্ছেন এবং সেখানে আপনি বিভিন্ন ক্রিয়াকলাপটি পুনরায় ঘোষিত-ওজে-সি-তে দেখতে পাবেন। আশা করি এই টিপটি আপনাকে যতটা সহায়তা করবে ততটাই আপনাকে সহায়তা করবে।


0

উদ্দেশ্য-সি তে সুইফ্ট ক্লাস ব্যবহার করা

আপনি যদি কোনও অ্যাপ্লিকেশন টার্গেটের মধ্যে কোড আমদানি করতে যাচ্ছেন (এক প্রকল্পে উদ্দেশ্যমূলক-সি এবং সুইফ্টের মিশ্রণ) আপনার #import "<#YourProjectName#>-Swift.h"উদ্দেশ্যটি-সি কোডে সুইফট কোডটি উন্মুক্ত করতে পরবর্তী আমদানি লাইনটি ব্যবহার করা উচিত [কোনও প্রকল্পে সুইফট এবং উদ্দেশ্য-সি কোড মিশ্রণ]

এই পোস্টে আমি কীভাবে উদ্দেশ্য-সি কোডে সুইফট স্ট্যাটিক লাইব্রেরি আমদানি করব তা বর্ণনা করব

উদ্দেশ্য-সি গ্রাহক -> সুইফট স্ট্যাটিক লাইব্রেরি

এক্সকোড সংস্করণ 10.2.1

সুইফট স্ট্যাটিক লাইব্রেরি তৈরি করুন

Create Swift static libraryপরবর্তী সংযোজনগুলি অনুসরণ করুন :

সুইফট API প্রকাশ করুন। উদ্দেশ্য-সি থেকে সুইফটের ফাংশনগুলি ব্যবহার করতে [সম্পর্কে]

বিল্ডিংয়ের পরে আপনার একটি <product_name>-Swift.hফাইল সন্ধান করা উচিত যা [ফাইল খুঁজে পাওয়া যায়নি] এর মধ্যে অবস্থিত হওয়া উচিতDerivedSources

সুইফট স্ট্যাটিক লাইব্রেরি সহ উদ্দেশ্য-সি গ্রাহক

Drag and dropএক্সকোড প্রকল্পে বাইনারি [সম্পর্কে]

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[লাইব্রেরী জন্য পাওয়া যায়নি] [Recursive পথ]

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[মডিউল পাওয়া যায়নি] [Recursive পথ]

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

.swift fileউদ্দেশ্য-সি প্রকল্পে খালি যুক্ত করুন । [অপরিবর্তিত প্রতীক] যখন এক্সকোড জিজ্ঞাসা করুন তৈরি করুন 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

এক্সকোড 11.3.1:

যখন আমি একটি অবিজ্যাক কোডে একটি সুইফ্ট অভ্যন্তরীণ শ্রেণিটি ব্যবহার করতে চাই, তখন এটি ত্রুটি "অনির্ধারিত প্রতীক" (অভ্যন্তরীণ শ্রেণি এবং বহিরাগত শ্রেণীর জন্য বিরক্ত করার জন্য) সংকলন করে না, আমি উত্পন্ন "-Swift.h" শিরোনামটি পরীক্ষা করেছিলাম এবং উভয় শ্রেণি হ'ল আছে।

ঘন্টার পর ঘন্টা চেষ্টা করার পরে আমি অভ্যন্তর শ্রেণিকে একটি সাধারণ শ্রেণিতে রূপান্তর করি এবং এটি সংকলিত হয়।

আমি প্রকল্পটি পরিষ্কার করছি, ডেরিভডডাটা ফোল্ডারটি মুছুন এবং এটি সংকলন করে।


1
আপনি কি @objcঅভ্যন্তর শ্রেণীর ঘোষণার আগে যুক্ত করার চেষ্টা করেছিলেন ?
dnnagy

ধন্যবাদ @ ডিএনগনি, এটি পরীক্ষা করে দেখেছি যে এটি সিনট্যাক্সের সমস্যা নয়।
বিল চ্যান

-1

উপরের সমস্ত কিছু করার পরেও আমি ত্রুটি পেয়েছি। আমার সমস্যাটি শেষ হয়েছে যে আমার যে সুইফট ফাইলগুলির প্রয়োজন ছিল তা কোনও কারণে বান্ডিল সংস্থানগুলিতে যুক্ত করা হয়নি।

আমি [MyTarget]> বিল্ড পর্যায়সমূহ> কপি বান্ডিল রিসোর্সগুলিতে গিয়ে এর পরে এটি ঠিক করেছি, তারপরে প্লাস বোতামটি ক্লিক করে সুইফট ফাইল যুক্ত করেছি।


অনুলিপি বান্ডিল রিসোর্সে সোর্স কোডটি অন্তর্ভুক্ত করা উচিত নয়
বিল চ্যান
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.