কীভাবে আমি সুইফট কোডটি অবজেক্টিভ-সি তে আমদানি করতে পারি?


281

আমি সুইফটে একটি লাইব্রেরি লিখেছি এবং আমি এটি আমার বর্তমান প্রজেক্টে অবজেক্টিভ-সি-তে লিখে আমদানি করতে পারিনি।

এটি আমদানির কোনও উপায় আছে কি?

#import "SCLAlertView.swift" - 'SCLAlertView.swift' file not found

9
এই প্রকল্প ভালবাসা!
স্লিপসননিউজপ্যাপারস

উত্তর:


430

আপনার আমদানি করা দরকার TargetName-Swift.h । লক্ষ্য করুন যে এটি লক্ষ্য নাম - অন্যান্য উত্তরগুলি বর্গের নামটি ব্যবহার করার ক্ষেত্রে ভুল করে।

এই একক ফাইলটি একটি স্বয়ংক্রিয় জেনারেটেড শিরোলেখ যা আপনার প্রকল্পের সমস্ত সুইফ্ট শ্রেণীর জন্য অবজেক্টিভ সি ইন্টারফেসগুলি সংজ্ঞায়িত করে যা হয় @objcবা এর সাথে উত্তরাধিকারসূত্রে লিখিত হয় NSObject

বিবেচ্য বিষয়:

  • যদি আপনার টার্গেট নামের স্পেস থাকে তবে এটিকে আন্ডারস্কোর দিয়ে প্রতিস্থাপন করুন (উদাঃ My Projectহয়ে যায় My_Project-Swift.h)

  • যদি আপনার লক্ষ্যটি একটি কাঠামো হয় তবে আপনার আমদানি করা দরকার <TargetName/TargetName-Swift.h>

  • আপনার সুইফট ফাইলটি লক্ষ্যটির সদস্য কিনা তা নিশ্চিত করুন


5
মনে রাখবেন যে আপনি যদি আমদানিতে সুইফ্ট ফাইল নামটি ব্যবহার করার চেষ্টা করেন তবে আপনি "প্রত্যাশিত 'ত্রুটিটি পাবেন; শীর্ষ স্তরের ঘোষক পরে "। "আমদানি ফাউন্ডেশন" এর পরে আপনার সুইফ্ট ফাইলটিতে।
louielouie

8
সম্পাদনা: দ্রষ্টব্য: এটি কাজ করার জন্য, একটি প্রকল্পের মডিউল নাম অবশ্যই সংজ্ঞায়িত করা উচিত। দেখুন: স্ট্যাকওভারফ্লো.com
রুবেন মার্টিনেজ জুনিয়র

7
আমি কেবল একটি নোট যোগ করতে চাই যে যদি আপনার প্রকল্পের নামের কোনও সাদা জায়গা বা বিশেষ অক্ষর থাকে তবে আপনাকে সেগুলি আন্ডারস্কোরগুলির সাথে প্রতিস্থাপন করতে হবে, যেমন "আমার অ্যাপ্লিকেশন "টি হবে" মাই_অ্যাপ-সুইফট এইচ "
হোলা সোয়ে এডু ফেলিজ নাভিদাদ

84
কেন এটি এত কঠোর এবং দুর্বল নথিভুক্ত?
উছুগাকা

3
@ লেলেলো না, ফাইলটি এর বিপরীতে। ব্রিজিং শিরোনামটি বিকাশকারী দ্বারা লিখিত হয় এবং আপনাকে আপনার সুইফট কোডের মধ্যে উদ্দেশ্য-সি এবং সি চিহ্নগুলি আনতে দেয়। টার্গেট- Swift.h ফাইলটি স্বয়ংক্রিয়ভাবে উত্পন্ন হয় এবং আপনার উদ্দেশ্য-সি / সি কোড সুইফট প্রতীক অ্যাক্সেস করতে দেয়।
বিল

154

অ্যাপল ওয়েবসাইট থেকে নির্দেশাবলী:

একই কাঠামো থেকে অবজেক্ট-সি তে সুইফট কোড আমদানি করতে

অধীনে সেটিংস বিল্ড , ইন প্যাকেজিং , নিশ্চিত করুন সংজ্ঞায়িত মডিউল যে ফ্রেমওয়ার্ক লক্ষ্য জন্য সেটিং সেট করা হয় হ্যাঁ । এই কাঠামোটি লক্ষ্যবস্তুতে এই বাক্য গঠনটি ব্যবহার করে যথাযথ নামগুলি স্থির করে framework কাঠামোর লক্ষ্য থেকে যে কোনও উদ্দেশ্য-সি .এম ফাইলের মধ্যে সেই ফ্রেমওয়ার্ক লক্ষ্য থেকে সুইফট কোডটি আমদানি করুন:

# আমদানি

পুনর্বিবেচনাসমূহ:

আপনি কেবলমাত্র .m ফাইলগুলিতে "ProductName-Swift.h" আমদানি করতে পারেন ।

আপনার টার্গেটে থাকা সুইফ্ট ফাইলগুলি এই আমদানির বিবৃতি সম্বলিত উদ্দেশ্য-সি .এম ফাইলগুলিতে দৃশ্যমান হবে।

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

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


2
কেবলমাত্র .m ফাইলগুলিতে "ProductName-Swift.h" আমদানি করুন। .Pch ফাইলটিতে একই যুক্ত করা হচ্ছিল "" CLLocationManagerDelegate "এর জন্য প্রোটোকল ঘোষণা খুঁজে পাওয়া যায় না; আপনি কি 'NSLayoutManagerDelegate' বোঝাতে চেয়েছিলেন?"
আলফোনস আর ডসুজা

@ আজিত এটি সরাসরি করে না, ডকুমেন্টেশন বলে যে। সবচেয়ে সহজ উপায় হ'ল একটি উদ্দেশ্য-সি বর্গ তৈরি করা যা উদ্দেশ্য-সি ++ বোঝে এমন বিন্যাসে অনুবাদ করে। বিকাশকারী.এপ্লে.লাইবারি
আলেজান্দ্রো ইভান

1
নোট করুন যে আপনি থেকে প্রাপ্ত করতে হবে NSObject!!! আপনি কেবল তাত্ক্ষণিকভাবে একটি class Blah দ্রুত ঘোষণা করতে এবং এটি কাজ করতে পারবেন না । এটি হওয়া দরকারclass Blah : NSObject
ডেভিড টি।

কিছু ক্ষেত্রে এই উত্তরটি পড়ার পক্ষে মূল্যবান: stackoverflow.com/questions/26328034/… আপনি যা করছেন তার উপর নির্ভর করে: # আমদানি <প্রোডাক্টনাম / প্রোডাক্টমডিউলনাম-সুইফট।> # আমদানি <প্রোডাক্টমডিউলনাম-সুইফট.h> # ইমপোর্ট <নিউটেষ্ট অ্যাপ / নিউটেষ্ট অ্যাপ -Swift.h>
inigo333

আপনি যদি একটি সুইফট এক্সটেনশান আমদানি করতে চান?
রিকার্ডো

150

করণীয় এখানে:

  1. উদ্দেশ্য-সি তে একটি নতুন প্রকল্প তৈরি করুন

  2. একটি নতুন .swiftফাইল তৈরি করুন  

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

  4. বিল্ড সেটিংসে ক্লিক করুন

  5. এই অনুসন্ধান বার অনুসন্ধান এবং সংজ্ঞায়িত মডিউল

  6. হ্যাঁ মান পরিবর্তন করুন ।

  7. পণ্য মডিউল নাম অনুসন্ধান করুন ।

  8. আপনার প্রকল্পের নামে মান পরিবর্তন করুন।

  9. অ্যাপের প্রতিনিধিতে, নিম্নলিখিতগুলি যুক্ত করুন: #import "YourProjectName-Swift.h"


দ্রষ্টব্য: আপনি যখনই আপনার সুইফ্ট ফাইলটি ব্যবহার করতে চান আপনাকে অবশ্যই নিম্নলিখিত লাইনটি আমদানি করতে হবে:

#import "YourProjectName-Swift.h"


1
এর মান পরিবর্তন করা Defines moduleমধ্যে Build settingsথেকে Yesআমার জন্য কি জিনিষ সংশোধন করা হয়েছে!
জাকারিয়া ব্র্যাকসা

এম্বেড থাকা সামগ্রীগুলিতে সুইফ্ট রয়েছে: হ্যাঁ এটিও ব্যবহার করুন
মোহিত

4
ভাল উত্তর তবে 7-8 ধাপের এক্সকোড 7.3.1 এবং উচ্চতর প্রয়োজন নেই
স্যাম বি

আমার জন্য কাজ! ধন্যবাদ।
d

1
শুধু যে যোগ করতে চান YourProjectNameমধ্যে #import "YourProjectName-Swift.h"পদক্ষেপ 8. দরকারী থেকে প্রকল্পের নাম হবে যদি আপনার প্রকল্পের নামে বিশেষ অক্ষর রয়েছে এবং আপনি কিভাবে নিশ্চিত ঠিক আপনি এটা ফরম্যাট করা উচিত নয়।
চক বরিস

40

আপনি যদি কোকোয়াপড ব্যবহার করছেন এবং কোনও ওজেসি প্রকল্পে একটি সুইফট পড ব্যবহার করার চেষ্টা করছেন তবে আপনি কেবল নিম্নলিখিতটি করতে পারেন:

@import <FrameworkName>;

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


1
অনেক ধন্যবাদ! তুমি আমার দিন বাঁচিয়েছ
এশা

এটি যদি আমরা কোকোপডসের মাধ্যমে সুইফ্ট-মেড লাইব্রেরি ইনস্টল করি তবে এটি একটি কবজির মতো কাজ করে। উপবিষ্টিত !!!
এনএসপ্র্যাটিক

21

অনুসন্ধান আপনার প্রকল্পের ফাইলে বিল্ড সেটিংসে যান এবং জেনারেট করা ইন্টারফেস শিরোলেখ নাম "উদ্দেশ্য সিযে সম্পত্তির মূল্য যে নামটি অন্তর্ভুক্ত করা উচিত নয়।

যদি আপনার "প্রোডাক্ট মডিউল নাম" বৈশিষ্ট্য (উপরের সম্পত্তিটি ডিফল্ট অনুসারে নির্ভর করে) আপনি পরীক্ষা / ডিবাগ / রিলিজ / ইত্যাদির জন্য সংকলন করেন কিনা তার উপর নির্ভর করে (যেমন এটি আমার ক্ষেত্রে হয়) তবে এই সম্পত্তিটিকে তার থেকে আলাদা করে তুলুন একটি কাস্টম নাম সেট করে বিভিন্নতা।


15

যদি Swiftফাইলটি সঠিকভাবে Objective-cনা হয় তবে ভিতরে ফাইল আমদানি করা এই ত্রুটির কারণ হতে পারে import

দ্রষ্টব্য: আপনাকে বাইরের বাইরে সুইফট ফাইলগুলি আমদানি করতে হবে না, আপনাকে কেবল একটি ফাইল আমদানি করতে হবে যা সুইফ্ট ফাইলগুলির যত্ন নেয়।

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

পরীক্ষা করে দেখুন Objective-C Generated Interface Header NameTargets -> Build Settings

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

উপরের ভিত্তিতে, আমি KJExpandable-Swift.hএটি যেমনটি আমদানি করব ।

আপনার হ'ল TargetName-Swift.h, যেখানে TargetNameআপনার প্রকল্পের নাম বা অন্য টার্গেটের উপর ভিত্তি করে পৃথক হওয়া আপনার এতে যুক্ত এবং চালিত হতে পারে।

আমার টার্গেটের নীচে যেমন রয়েছে KJExpandableতেমনি এটিKJExpandable-Swift.h
এখানে চিত্র বর্ণনা লিখুন


12

প্রথম ধাপ:-

নির্বাচন প্রকল্পের উদ্দিষ্ট -> সেটিং বিল্ড -> Search ( 'নির্ধারণ') -> নির্ধারণ মডিউল আপডেট মান কোন থেকে হ্যাঁ

"মডিউলটি সংজ্ঞায়িত করুন": হ্যাঁ

"সর্বদা এম্বেড স্ট্যান্ডার্ড গ্রন্থাগারগুলি": হ্যাঁ

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

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

দ্বিতীয় ধাপ:-

নীচে হিসাবে উদ্দেশ্য সি ".h" ফাইলটিতে সুইফট ফাইল শ্রেণি যুক্ত করুন

#import <UIKit/UIKit.h>

@class TestViewController(Swift File);

@interface TestViewController(Objective C File) : UIViewController

@end

উদ্দেশ্য প্রকল্প ".ম" ফাইলটিতে 'প্রকল্পের নাম (আপনার প্রকল্পের নাম) -সুইফট।' আমদানি করুন

//TestViewController.m 
#import "TestViewController.h"

/*import ProjectName-Swift.h file to access Swift file here*/

#import "ProjectName-Swift.h"

ক্লাসের ফরওয়ার্ড ডিক্লেয়ারেশন (@ ক্লাস) খুব ভাল পয়েন্ট! ধন্যবাদ!
ফিলিপ অটো

10

যদি আপনি একই কাঠামোর মধ্যে আপনার উদ্দেশ্য-সি ফাইলগুলিতে সুইফট কোড আমদানি করেন তবে একটি সাবধানতা রয়েছে । ফ্রেমওয়ার্কের নাম এবং কোণ বন্ধনী নির্দিষ্ট করে আপনাকে এটি করতে হবে:

#import <MyFramework/MyFramework-Swift.h>

MyFrameworkএখানে "পণ্য মডিউল নাম" বিল্ড সেটিংস ( PRODUCT_NAME = MyFramework)।

কেবল যুক্ত করা #import "MyFramework-Swift.h"কাজ করবে না। আপনি নির্মিত পণ্য তালিকা পরীক্ষা থাকেন (আগে যেমন একটি #importযোগ করা হয়, তাই আপনি অন্তত একটি সফল বিল্ড লক্ষ্য মধ্যে কিছু সুইফট কোড দিয়ে ছিল), তারপর আপনি এখনও ফাইল দেখতে পাবেন MyFramework-Swift.hমধ্যে Headersডিরেক্টরি।


8

আপনার যদি সুইফট 4-এ কোনও প্রকল্প তৈরি করা হয় এবং তারপরে উদ্দেশ্যমূলক-সি ফাইলগুলি যুক্ত করা থাকে তবে এটি এটি করুন:

@objcMembers
public class MyModel: NSObject {
    var someFlag = false         
    func doSomething() {         
        print("doing something")
    }
}

তথ্যসূত্র: https://useyourloaf.com/blog/objc-warnings-upgrading-to-swift-4/


আমার কোডে, আমি এটি সুইফট ৪.২ থেকে সুইফট ৩-এ আপডেট করার পরে এটি কাজ করছে না
এসএনআরুলা

আপনি কি ত্রুটি পাচ্ছেন? আমি উপরের কোডটি সুইফট ৪.২ এ ব্যবহার করেছি এবং এটির কাজ জরিমানা।
প্রশান্ত ভায়ানী

ঠিক আছে এটা দারুণ.
প্রশান্ত ভায়ানী

4

একই প্রকল্পে সুইফট এবং উদ্দেশ্য সি সম্পর্কে প্রাক-প্রকাশের নোটগুলি চেকআউট করুন

https://developer.apple.com/library/prerelease/ios/documentation/Swift/Conceptual/BuildingCocoaApps/MixandMatch.html#//apple_ref/doc/uid/TP40014216-CH10-XID_75

আপনার আমদানি করা উচিত

#import "SCLAlertView-Swift.h"

3
আমাকে এই ত্রুটিটি দেখিয়েছে: 'এসসিএলআরলেটভিউ-সুইফট।' ফাইলটি পাওয়া যায় নি।
ভিক্টর রাডচেনকো

2
প্রকল্পের নাম হতে হবে, ফাইলের নাম নয় - আমার উত্তর দেখুন।
বিল

1
ডকুমেন্টেশন লিঙ্কের জন্য ধন্যবাদ। যে রেফারেন্স জন্য দরকারী ছিল।
louielouie

2
প্রদত্ত লিঙ্কটি থেকে উদ্ধৃত করার জন্য: The name of this header is your product module name followed by adding "-Swift.h".সুতরাং এটি আপনার লেখার মতো শ্রেণীর নাম নয়, তবে আপনার পণ্যের মডিউলটির নাম এবং এটি কেবল একটি নির্দিষ্ট একটি নয়, সমস্ত সুইফট ফাইল আমদানির যত্ন নেয়
ক্রিস

4

জন্য অনুসন্ধান করুন "উদ্দেশ্য সি জেনারেট করা ইন্টারফেস শিরোলেখ নাম" লক্ষ্য আপনি বিল্ড করার চেষ্টা করছেন সেটিং Build এ (ধরুন এটা দিন MyApp-Swift.h), এবং আপনি এই ব্যবহারটি নির্ধারণ মান আমদানি (#import "MyApp-Swift.h" ) উৎস ফাইলে যেখানে আপনি অ্যাক্সেস করার চেষ্টা করছেন আপনার সুইফট APIs

এই ক্ষেত্রের জন্য ডিফল্ট মান $(SWIFT_MODULE_NAME)-Swift.h । আপনি যদি "উদ্দেশ্য-সি উত্পন্ন ইন্টারফেস শিরোনামের নাম" সেটিংয়ের মান ক্ষেত্রে ডাবল-ক্লিক করেন তবে আপনি এটি দেখতে পাবেন।

এছাড়াও, যদি আপনার মডিউলের নামে ড্যাশ থাকে (তবে এটি বলা যাক My-App), তবে $(SWIFT_MODULE_NAME)সমস্ত ড্যাশগুলিকে আন্ডারস্কোর দিয়ে প্রতিস্থাপন করা হবে। সুতরাং আপনি যোগ করতে হবে #import "My_App-Swift.h"


অনুমোদিত থেকে ভাল। ড্যাশগুলি 20 মিনিটের অপচয় হয় আমি কখনই হাহা ফিরে পাব না।
মুলিয়া

3

আপনি যদি সুইফট ব্যবহার করতে চান ফাইলটি অবজেক্টিভ-সি শ্রেণিতে , তাই এক্সকোড 8 থেকে আপনি নীচের পদক্ষেপগুলি অনুসরণ করতে পারেন:

আপনি যদি প্রকল্পটি উদ্দেশ্য-সিতে তৈরি করেছেন:

  1. নতুন সুইফ্ট ফাইল তৈরি করুন
  2. এক্সকোড স্বয়ংক্রিয়ভাবে অনুরোধ করবে ব্রিজ-শিরোলেখ ফাইলের
  3. এটি উত্পন্ন
  4. আপনার উদ্দেশ্য-সি নিয়ামকটিতে "প্রকল্পের নাম-সুইফট।" আমদানি করুন (ইন্টারফেসে নয় বাস্তবায়নে আমদানি করুন) (যদি আপনার প্রকল্পের নামের মধ্যে স্থান থাকে তাই "প্রকল্প_নাম-সুইফট।" ব্যবহার করুন)
  5. আপনি সুইফটে আপনার উদ্দেশ্য-সি শ্রেণিতে অ্যাক্সেস করতে সক্ষম হবেন।

এটি সংকলন করুন এবং যদি এটি লিঙ্কারের ত্রুটি তৈরি করে যেমন: আর্কিটেকচার x86_64 বা আর্মভ 7 এর জন্য পূর্ববর্তী ফাইলগুলির (2.0) তুলনায় সুইফট ভাষার নতুন সংস্করণ (3.0) এর সাথে সংকলিত

আপনার আরও একটি পরিবর্তন করুন

  1. এক্সকোড -> প্রকল্প -> লক্ষ্য -> বিল্ড সেটিংস -> লিগ্যাসি সুইফট ভাষা সংস্করণ ব্যবহার করুন -> হ্যাঁ

বিল্ড এবং রান।


1
আমি লেগ্যাসি সুইফট ভাষার সংস্করণ ব্যবহারের এই বিকল্পটি পাচ্ছি না
rd_

1

ড্যাশ এবং আন্ডারস্কোরগুলি সম্পর্কে সতর্ক থাকুন, সেগুলি মিশ্রিত হতে পারে এবং আপনার প্রকল্পের নাম এবং লক্ষ্যটির নাম SWIFT_MODULE_NAME এর মতো হবে না।

ড্যাশগুলি এবং আন্ডারস্কোরগুলি


1
#import <TargetName-Swift.h>

আপনি কিবোর্ড # ইমপোর্ট <থেকে প্রবেশ করার সময় দেখতে পাবেন এবং স্বয়ংক্রিয়ভাবে এক্সকোড আপনাকে পরামর্শ দেবে।


-1

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