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


84

আমার একটি পুরানো উদ্দেশ্য-সি প্রকল্প রয়েছে এবং আমি নতুন সুইফট ফাংশন এবং অবজেক্টকে কল করতে চাই, আমি " <ProjectName>-Bridging-Header.h" এবং " <ProjectName>-Swift.h" ফাইলটি তৈরি করেছি

আমার পক্ষে সুইফট থেকে অবজেক্টিভ-সি-তে ফাংশনটি কল করা সহজ ছিল তবে আমার বিপরীতে সমস্যা আছে।

সুতরাং আমি একটি সাধারণ ক্লাস তৈরি করেছি "সিস্টেম.সুইফ্ট"

import Foundation

@objc class System : NSObject {

    @objc func printSome() {
        println("Print line System");
    }
    
}

এখন আমি ডকুমেন্টেশনগুলি এখানে এবং <...>-Swift.hফাইলের ভিতরে অনুসরণ করার চেষ্টা করেছি this

@class System;

@interface System : NSObject

-(void)printSome;

@end

এবং আমি এটি আমার উদ্দেশ্য-সি ক্লাসের মধ্যে আমদানি করেছি। আমার অবজেক্টিভ সি কোড (বর্তমানে ইউআইভিউউকন্ট্রোলার) এর অবজেক্টিভ সি এর ভিতরে এই মুহুর্তে আমি "প্রিন্টসোম" পদ্ধতিতে কল করার চেষ্টা করেছি:

- (void)viewDidLoad
{
    [super viewDidLoad];
    System * sis = [[System alloc] init];
    [sis printSome];
    //any additional setup after loading the view from its nib.
}

এখন আমি নিম্নলিখিত ত্রুটি আছে:

আর্কিটেকচার i386 এর জন্য অপরিবর্তিত প্রতীকগুলি: " OBJC_CLASS $ _S সিস্টেম", থেকে উল্লেখ করা হয়েছে: "ObjectiveC_Class_That_Call_Swift_Object" .O ld: চিহ্ন (গুলি) আর্কিটেকচারের জন্য পাওয়া যায়নি I386 বিড়ম্বনা: ত্রুটি: লিঙ্কার কমান্ড প্রস্থান কোড 1 সহ ব্যর্থ হয়েছে (ব্যবহার করুন) -ভিক্ষা দেখতে)


আপনার একটি লিঙ্কারের ত্রুটি রয়েছে। এটি কি: (1) আপনার সুইফট কোডের জন্য উদ্দেশ্য-সি ব্রিজিং শিরোনাম এবং উত্পন্ন শিরোনামের নামকরণ করার সময় এক্সকোড আপনার পণ্য মডিউলটির নাম ব্যবহার করে - আপনার টার্গেটের নাম নয় or আপনি যে সুইচ কোডটি অ্যাক্সেস করতে চান সেটি উদ্দেশ্য-সি .এম ফাইলটিতে সুইফট উত্পন্ন হেডারটি আমদানি করার আগে প্রকারগুলি? আপনার অবজেক্টি-সি কোডে # ইমপোর্ট "প্রোডাক্টমডিউলনেম-সুইফট।" আছে?
পিটার্ট

হ্যাঁ আমি ডকুমেন্টেশন পড়েছি এবং "প্রোডাক্টমোডেলনাম" এর নামটি স্রোতযুক্ত ... এখানে একটি বাগ রয়েছে যে বিল্ড সেটিংয়ের ভিতরে পণ্য মডেলটি সেট করা হয়নি ... আমি এমনকি এটি সেট করে
রেখেছি

@ পেটার আপনি কি দ্বিতীয় পয়েন্টটি আরও ভালভাবে ব্যাখ্যা করতে পারবেন? আমি সবসময় লিখেছিলাম ...
এলরেডেন

সমস্যা সমাধান হয়েছে, আমি আমার প্রজেক্ট <প্রোডাক্ট মডেলনেম> -সুইফট.কে একটি নতুন .h ফাইল যুক্ত করেছি তবে এটি প্রয়োজনীয় নয় কারণ সংকলক কেবল এটি দেখতে না পারলেও এই বস্তুটি তৈরি করে। আমি যে নতুন ফাইল তৈরি করেছি তা আমি মুছে ফেলেছি এবং এখন সমস্তই নিখুঁতভাবে চলে। Tnx পিটার্ট
এলোরডেন

আপনি নিজের প্রশ্নের উত্তর দিতে পারেন - এটি অন্যকে সহায়তা করতে পারে।
পিটার্ট

উত্তর:


52

সমস্যা সমাধান করা, আমি এর আগে নামযুক্ত .hআমার উদ্দেশ্য সি- ক্লাসে একটি নতুন ফাইল তৈরি এবং অন্তর্ভুক্ত করেছি <ProductModuleName>-Swift.hতবে আমি পরে আবিষ্কার করেছি যে এই ধাপটি প্রয়োজনীয় নয় কারণ সংকলক প্রয়োজনীয় ফাইলটি অদৃশ্য করে তোলে।

কেবল <ProductModuleName>-Swift.hআপনার ক্লাসে অন্তর্ভুক্ত করুন এবং এটি কাজ করা উচিত।


4
পরামিতি সঙ্গে ফাংশন সম্পর্কে?
আর্নলি ভিজকায়নো

4
আমি প্যারামিটার এবং একটি রিটার্ন মান সহ সুইফট ফাংশনগুলিতে অ্যাক্সেস করতে সক্ষম নই, না পরামিতি ছাড়াই এবং কোনও ফেরতের মান ছাড়া আমি সুইফট ফাংশনগুলিতে অ্যাক্সেস করতে সক্ষম নই। কেন জানি না। আমার সুইফ্ট ক্লাসটি একটি এনএসবজেক্ট, আমি ফাউন্ডেশন কাঠামোটি আমদানি করেছি, ক্লাস এবং ফাংশনগুলির @objcউপসর্গ রয়েছে। -Swift.hস্বয়ংক্রিয়ভাবে তৈরি হয়েছে। জিনিসটি যা আমাকে মাথাব্যথায় পরিণত করছে তা হ'ল আমি ক্লাসে নিজে কল করতে পারি তবে এর ভিতরে কোনও ক্রিয়াকলাপ নয়। কোন এক কেন জানেন না?
ডেভিড গলজুজার 18


4
এটা <productModuleName>-.Swift.h(না model)।
SwiftArchitect

4
আপনার পণ্যের নাম এতে কোনো শূণ্যস্থান থাকে, তাহলে, আন্ডারস্কোর সঙ্গে তাদের প্রতিস্থাপন মত: #import "My_Project-Swift.h"
এরিকরোবার্টব্রেয়ার

41

এটি আশ্চর্যজনক তবে এটি কাজ করবে

1) Add @objc  to  Swift class

2) Add in .m 
    #import "(ProjectName)-Swift.h"

3) Call from .h
    @class SwiftClass;

4)On SwiftClass 
   click "Command" + Left Click (Apple Documantation)

5) To see "-Swift.h" -> click "Command" + Left Click

অ্যাপ্লিকেশনটি এই শ্রেণীর জন্য ইন্টারফেস জেনারেট করে সুইচ.ইচ

উদাহরণ: SWIFT_CLASS ("_ টিটিসি 10 প্রজেক্ট 17220PL হেল্পার") @ ইন্টারফেস পিএলহেল্পার

  • (বাতিল) অবহিত করুন ডাউনলোডডাউনডিং: (এনএসডেটরিয় *) ব্যবহারকারীআইএনফো;
  • (উদাহরণস্বরূপ) init OBJC_DESIGNATED_INITIALIZER; @শেষ

আপনি নিজের সুইফট শ্রেণির @objc (MyClassName)
ওবিজে

12
যে কেউ আমার মতো বোবা ভুল করতে পারে For ধাপ 2 ইন, আপনি ব্যবহার করছেন (ProjectName)-Swift.h, না (ClassName)-Swift.h !
হিলং

ধন্যবাদ @ সুইটলানা, অবিশ্বাস্য, এটি কাজ করেছে !!! তবে আমার যুক্ত পদ্ধতিগুলি ক্লাসের অন্যান্য জায়গায় সরিয়ে নিয়ে আমাকে এই পদক্ষেপগুলি বহুবার পুনরায় চেষ্টা করতে হবে।
স্কিফিল্ড ট্রান

4
3) @class SwiftClassName;আমাকে বাঁচালেন
মাজন কাসের

33

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

নিম্নলিখিত পদক্ষেপগুলি হ'ল: -

  1. "মাইবজেক্টিভ সিলেস.এম" এ # মিম্পোর্ট "মাই ফার্স্টপ্রজেক্টঅনসুইফ্ট-সুইফট। Ht" যুক্ত করুন

  2. মাইওবজেক্টিভ সিএলএস এইচ-এ @ ক্লাস মাইসইউফিটক্লাস যুক্ত করুন;

  3. তারপরে মায়োবজেক্টিভ সিলেস.এম.

    mySwiftClass * myClass = [মাইসুইফ্টক্লাস নতুন]; Wherever আপনি যেদিকেই সুইফ্ট পদ্ধতিতে কল করতে চান যে কোনও পদ্ধতিতে এটির মতো কল করুন}

  4. [মাই ক্লাস পদ্ধতি নাম];


4
mySwiftClass * myClass = [mySwiftClass নতুন] এটি আমার পক্ষে কাজ করছে না >>>>>
হরি নারায়ণন

@ হরিণারায়ণন এটি হওয়া উচিত নয়, কেউ মনে করেন যে উদ্ভূত ডেটা পরিষ্কার করে এবং আপনার প্রকল্পটি আবার খোলে।
অনুভ গিরি

12

উদ্দেশ্য-সিতে আপনার .m ফাইলের উপর আমদানি করে -Swift.h ফাইলটি পরীক্ষা করুন:

#import <YourProjectName-Swift.h>

সেই লাইনে ক্লিক করুন, এবং বাম-ক্লিক - সংজ্ঞাতে লাফ দিন।

এই ফাইলটি ম্যানুয়ালি নয়, স্বয়ংক্রিয়ভাবে অন্তর্ভুক্ত করা উচিত।


2

আপনি যদি এখনও আমদানি করেও আপনার ক্লাসটি না দেখেন <ProductModuleName>-Swift.h

নিশ্চিত হয়ে নিন যে আপনার শ্রেণি একটি নেটিভ ক্লাস (উদাহরণস্বরূপ UIViewController) সাবক্লাস করছে বা কমপক্ষে যদি এটি কেবল একটি ইউটিলিটি শ্রেণি হয় তবে এটি সাবক্লাস করুন NSObject। আপনার ক্লাস এখন দেখাতে হবে।


2

এই পোস্টে যে কেউ হোঁচট খাচ্ছে এবং যার জন্য অন্যান্য উত্তরগুলি কাজ করে না তার জন্য সামান্য অতিরিক্ত পরামর্শ: আপনাকে আপনার সুইফ্ট শ্রেণিকে "পাবলিক" ঘোষণা করতেও হতে পারে।

উদাহরণ:

@objc public class MySwiftClass: NSObject {


0

ওবজে-সি থেকে সুইফটে স্থানান্তরিত হওয়া প্রকল্পগুলিতে অবজেক্টিভ-সি থেকে সুইফট কোড কার্যকর করার পুনঃব্যবস্থার উপায়টি ব্রিজ / প্রক্সি প্যাটার্ন ব্যবহার করছে।

  1. ব্রিজটি বাস্তবায়ন করুন।

import Foundation

@objc class AnalyticsPropertyBridge: NSObject {

private var analytics: AnalyticsManager = AnalyticsManager()

@objc func refreshProperties() {

    self.analytics.set(AnalyticsProperty.clientType)
}

}

  1. ছাতা ফাইলে (ব্রিজিং-শিরোনাম) আইজেক্টসি কলার মডিউলটি অন্তর্ভুক্ত করুন:

#import "CallerModule.h"

  1. অবশেষে কলার। এম ফাইলটিতে, দুটি সমস্যা:

৩.এ ছাতা ফাইল আমদানি করুন:

#import "MyProject-Swift.h"

3.b ব্রিজ কল করুন।

[[AnalyticsPropertyBridge new] refreshProperties];

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


-1

কেউ যদি এখনও সমস্যা নিয়ে থাকে তবে এখানে একটি ভাল নিবন্ধ।

সুইফ্ট এবং অবজেক্টিভ-সি ইন্টারঅ্যাপেরিবিলিটি সেট আপ করা হচ্ছে

  1. এই নিবন্ধটি কীভাবে ওবিজেসি-তে সুইফট ফাইলগুলি আমদানি করতে হবে সেই সাথে ওবিজেসি ফাইলগুলিকে সুইফটে কীভাবে গভীরভাবে আমদানি করবে তা আলোচনা করা হয়েছে।
  2. প্রকল্পের নামটিতে স্থান থাকলে সাধারণত এটি যে সমস্যার মুখোমুখি হয় তাও এটি সমাধান করে।
  3. এটি "পণ্য মডিউল নাম" পতাকা সম্পর্কেও আলোচনা করে।

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