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


115

আমি নামক AnalyticProtocolএকটি উদ্দেশ্য-সি শ্রেণিতে নামক একটি সুইফট প্রোটোকল আমদানির চেষ্টা করব AnalyticFactory

protocol AnalyticProtocol
{

}

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

আমার সুইফ্ট ফাইলটিতে আমি .hনামকৃত ফাইলটি অন্তর্ভুক্ত করেছি MyProjectName-Swift.hতবে সংকলকটি আমাকে বলে একটি ত্রুটি ফিরিয়ে দিয়েছে যে এটি বিদ্যমান নেই । সুতরাং, আমি একটি .hফাইল তৈরি করেছি MyProjectName-Swift.hযা আসলে খালি (আমি জানি না আমার ভিতরে কী রাখা উচিত)।

ইন অ্যাপল ডকুমেন্টেশন তারা বলেছিল যে আমি আমার অন্তর্ভুক্ত করা আছে .hফাইল নামে MyProjectName-Swift.hআমার মধ্যে .mফাইল। তবে আমার এটি আমার .mফাইলে নয় বরং আমার মধ্যে অন্তর্ভুক্ত করা দরকার .h। এটি কি সমস্যাযুক্ত হতে পারে?

আমি যখন সংকলনের চেষ্টা করেছি তখন আমি এই ত্রুটিটি পেয়েছি :: 0: ত্রুটি: xxxAnalyticFactory.h: 39: 'অ্যানালিটিকপ্রোটোকল' এর জন্য প্রোটোকল ঘোষণার সন্ধান করতে পারে না

এবং ইনক্রিমেন্টেড কোড:

@interface AnalyticFactory : NSObject
{
    Class<AnalyticProtocol> _analyticProtocolClass; // The type of the analytic class currently used.
}

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

আমি যা করছি তাতে কি কেউ ত্রুটি দেখছে?


পরীক্ষা করে দেখুন উদ্দেশ্য সি সঙ্গে একীভূত সুইফট WWDC 2014. থেকে ভিডিও ভিডিওতে প্রায় 30:40, তারা কিভাবে অ্যাক্সেস করবেন তা বর্ণনা উদ্দেশ্য সি ক্লাসের সুইফট প্রোটোকল।
জেমি ফরেস্ট

উত্তর:


224

আপনি যোগ করতে হবে @objcযাতে মত আপনার সুইফট প্রোটোকল থেকে অ্যাট্রিবিউট:

@objc protocol AnalyticProtocol {

}

25
আপনার উত্তরের জন্য ধন্যবাদ তবে সমস্যাটি এখনও অব্যাহত রয়েছে।
জিন লেব্রুমেন্ট

আপনি কি কোনও নমুনা প্রকল্প পোস্ট করতে পারেন যা সমস্যার পুনরুত্পাদন করে?
জেমি ফরেস্ট

@Objc যুক্ত করা আমাকে ওবজ-সি-তে স্যুইফট ক্লাসগুলি আমদানি করতে সহায়তা করেছে
সার্জ

19
@objc সবসময় কাজ করে না। যখন একটি প্রোটোকল সঙ্গে মানানসই কখনও কখনও এটি যখন উপর প্রোটোকল যোগ কাজ করে না @interfaceযে .hফাইল। যাইহোক, আপনি ব্যক্তিগত হিসাবে প্রোটোকল যোগ করতে পারেন @interfaceমধ্যে .mফাইল এবং এটি কিছু সংশোধন করা হয়েছে (অন্তত এটা অনুষ্ঠানে আমার জন্য আছে)। সুতরাং উপরে আপনার @implementationআছে @interface MyController() <AnalyticProtocol>
অ্যাডাম

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

77

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

সুতরাং, যেহেতু আপনি একটি ওবাইসি শিরোলেখ ফাইলটিতে সুইফট কোডটি ব্যবহার করতে চান, আপনার যেমন ক্লাস এবং প্রোটোকলগুলি অবজেক্ট হেডার ফাইলটিতে আপনি ব্যবহার করতে চান তা "ফরোয়ার্ড ডিক্লেয়ার" করতে হবে:

@protocol AnalyticProtocol;

আপনি এখন আপনার অবজেক্ট শ্রেণির ঘোষণায় প্রোটোকলটি ব্যবহার করতে পারেন:

@interface AnalyticFactory : NSObject
{
    Class<AnalyticProtocol> _analyticProtocolClass; // The type of the analytic class currently used.
}

আপনার বাস্তবায়ন ফাইলে (অবজেক্ট। এম ফাইল), আপনি এক্সকোড জেনারেটেড সুইফ্ট শিরোনাম ("ProductModuleName-Swift.h") ফাইলটি আমদানি করতে পারেন এবং সঠিক প্রয়োগটি AnalyticProtocolএখন কম্পাইলারের কাছে জানা যাবে।

এটি অ্যাপল ডক্সে "উদ্দেশ্যটি-সি থেকে সুইফট ব্যবহার করা" বিভাগেও বর্ণিত হয়েছে

নোট করুন যে আপনি যখন ফরওয়ার্ড ঘোষিত প্রোটোকল ব্যবহার করেন ("'অ্যানালিটিকপ্রোটোকল' এর জন্য প্রোটোকল সংজ্ঞাটি পাওয়া যায় না) তবে এক্সকোড হ'ল অ্যাজেক্টি হেডার ফাইলটিতে একটি সতর্কতা দেবে, তবে এটি উপেক্ষা করা যায় - সংকলনের সময় বাস্তবায়নটি পাওয়া যাবে will


19
Xcode প্রোটোকল অনুপস্থিত প্রতিপন্ন করার জন্য সতর্কতাটি কেন দেখায় যখন এটি সংকলন করে এবং সূক্ষ্মভাবে কাজ করে? সতর্কতা অপসারণের কোনও উপায়?
ওরেেন

যদিও এখনও এই ক্লাসে প্রোটোকল পদ্ধতিগুলি কল করা সম্ভব নয়। এটি ত্রুটিটি দেবেNo visible @interface for <ClassName> declares the selector <protocolMethodName>
এলসা

এটি নিম্নলিখিত সতর্কবার্তাটি উত্পন্ন করে: "
এক্সএক্সএক্সএক্সএক্সের

51

যে কারও জন্য কেবল প্রোটোকল গ্রহণ করা দরকার - আপনি কোনও সতর্কতা বা ত্রুটি তৈরি না করেই দুটি পদক্ষেপে এটি করতে পারেন:

  1. আপনার .swiftফাইলে, @objcপ্রোটোকলের নামের আগে যুক্ত করুন :

    @objc protocol AnalyticProtocol {
    
    }
    
  2. আপনার .mফাইলে, উত্পন্ন উত্সাহীন শিরোনামটি আমদানি করুন এবং একটি প্রাইভেট বিভাগে প্রোটোকল গ্রহণ করুন। (শিরোনাম ফাইলটির নাম স্বয়ংক্রিয়ভাবে দেওয়া হয়েছে):

    #import "ProductModuleName-Swift.h"
    
    @interface AnalyticFactory () <AnalyticProtocol>
    
    @end
    

এটি অ্যাপলের প্রস্তাবিত পন্থা। আপনি এখানে উদ্দেশ্য এবং সি এবং সুইফ্টের মিশ্রণ এবং মেলা সম্পর্কে আরও শিখতে পারেন: https://developer.apple.com/library/content/docamentation/Swift/Conceptual/ বিল্ডিংকোয়া অ্যাপস / মিক্স্যান্ডম্যাচ html


1
আমি এখনও একটি সতর্কতা পাই, ফরওয়ার্ড ডিকোলেশন সহ বা ছাড়াই। আমি একটি এক্সটেনশনে প্রোটোকল ব্যবহার করছি।
ক্রিশ্তি বালু

আমদানি করা যায় না #import "AnalyticProtocol-Swift.h"। দেখে মনে হচ্ছে যে যাই হোক না কেনো প্রোটোকল-সুইফট। আপনি যেমন বলেছিলেন তেমন স্বয়ংক্রিয়ভাবে উত্পন্ন হয় না।
হ্লুং

2
এটি আমার পক্ষে কাজ করেছিল; এই পৃষ্ঠায় অন্য কোনও পরামর্শ বা উত্তর কাজ করে না। আমি সুইফট ৪ এ আছি।
পলসবো

1
সতর্কবার্তা অপসারণের একমাত্র উপায় ছিল (প্রোটোকলগুলি যখন শিরোনাম ফাইলটিতে থাকে তখনও এটি কাজ করে)
ডেভিড পি

1
একই লিঙ্কটি
ওয়েবআর্কাইভের

3

যদি আপনি কোনও কাঠামো তৈরি করে থাকেন তবে প্রয়োজনীয় আমদানি করুন

#import "ProductModuleName-Swift.h"

এতে পরিবর্তিত হয়:

#import <ProductModuleName/ProductModuleName-Swift.h>

এই ক্ষেত্রে আপনাকে অবশ্যই সুইফ্ট প্রোটোকলটি সর্বজনীন করতে হবে :

@objc public protocol AnalyticProtocol {
  func something();
}

3

কোডের কয়েকটি পরিবর্তন সহ আমরা ওজেক্টিভ সিতে সুইফ্ট প্রোটোকল ব্যবহার করতে পারি। এছাড়াও, @objc ঘোষিত প্রোটোকলগুলি আপনাকে ডিফল্ট বাস্তবায়ন ছাড়াই optionচ্ছিক এবং প্রয়োজনীয় পদ্ধতিগুলি দেয়। এটা উপকারিতা এবং কনস সঙ্গে আসে।

উদ্দেশ্য প্রকট সি ব্যবহার করার সময় আমরা প্রোটোকলটির নামটি আরও বর্ণনামূলকভাবে পুনরায় নামকরণ করতে পারি "আমি" @jjc (ওরফে_নাম) "ব্যবহার করি।

কোডটি এখানে, ওবজেসি কোডে ব্যবহার করার জন্য @objc অ্যাট্রিবিউট এবং ওরফে নাম সহ একটি সুইফ্ট প্রোটোকল রাখুন।

@objc(ObjTableViewReloadable) protocol TableViewReloadable: class {
   func reloadRow(at index: IndexPath)
   func reloadSection(at index: Int)
   func reloadTable()
}

এখন ফরওয়ার্ড .h ফাইলে আমাদের প্রোটোকলটি ঘোষণা করে

@protocol ObjTableViewReloadable;

আপনি এখন .m ফাইলে এই প্রোটোকলের সাথে সামঞ্জস্য করতে পারেন এবং প্রয়োজনীয় পদ্ধতিগুলির বাস্তবায়ন যুক্ত করতে পারেন।

#import "MyApp-Swift.h"
@interface MyObjcViewController () <ObjTableViewReloadable>

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