যদিও আমি মনে করি আমি আপনার প্রশ্নের উত্তর দিতে পারি, এটি আপনার পছন্দ হবে এমন কোনও উত্তর নয়।
টিএল; ডিআর: @objc
ফাংশনগুলি বর্তমানে প্রোটোকল এক্সটেনশনে নাও থাকতে পারে। পরিবর্তে আপনি একটি বেস শ্রেণি তৈরি করতে পারেন, যদিও এটি আদর্শ সমাধান নয়।
প্রোটোকল এক্সটেনশানস এবং উদ্দেশ্য-সি
প্রথমত, এই প্রশ্ন / উত্তর ( উদ্দেশ্য-সি-তে প্রোটোকলগুলিতে এক্সটেনশনের উপরে সংজ্ঞাযুক্ত সুইফট পদ্ধতিটি বোঝাতে পারে ) প্রোটোকল এক্সটেনশানগুলি হুডের অধীনে প্রেরণ করার কারণে, প্রোটোকল এক্সটেনশনে ঘোষিত পদ্ধতিগুলি ফাংশনটিতে দৃশ্যমান নয় objc_msgSend()
এবং সুতরাং উদ্দেশ্য সি-কোডে দৃশ্যমান নয়। যেহেতু আপনি আপনার এক্সটেনশনে সংজ্ঞায়নের চেষ্টা করছেন সেটি অবজেক্টিভ-সি (তাই UIKit
এটি ব্যবহার করতে পারে) এর জন্য দৃশ্যমান হওয়া দরকার , এটি @objc
আপনাকে অন্তর্ভুক্ত না করার জন্য চিৎকার করে , তবে একবার এটি অন্তর্ভুক্ত করার পরে এটি আপনাকে চিত্কার করে কারণ @objc
এটি অনুমোদিত নয় in প্রোটোকল এক্সটেনশন। এটি সম্ভবত কারণ প্রোটোকল এক্সটেনশনগুলি বর্তমানে উদ্দেশ্য-সি-তে দৃশ্যমান হতে সক্ষম নয়।
আমরা আরও দেখতে পাচ্ছি যে ত্রুটি বার্তাটি একবার আমরা যুক্ত @objc
করেছিলাম "@objc কেবলমাত্র ক্লাসের সদস্য, @objc প্রোটোকল এবং ক্লাসের কংক্রিট এক্সটেনশনগুলির সাথে ব্যবহার করা যেতে পারে।" এটি কোনও শ্রেণি নয়; @objc প্রোটোকলটির বর্ধিতাংশ প্রোটোকল সংজ্ঞা নিজেই (যেমন প্রয়োজনীয়তার সাথে) থাকার মতো নয়, এবং "কংক্রিট" শব্দটি প্রস্তাব দেয় যে প্রোটোকল এক্সটেনশানটি কংক্রিট বর্গের এক্সটেনশন হিসাবে গণনা করা হয় না।
কর্মক্ষেত্র
দুর্ভাগ্যক্রমে, যখন ডিফল্ট বাস্তবায়নগুলি অবশ্যই উদ্দেশ্য-সি ফ্রেমওয়ার্কগুলিতে দৃশ্যমান হয় তখন প্রোটোকল এক্সটেনশানগুলি ব্যবহার করা থেকে এটি পুরোপুরি সম্পূর্ণরূপে বাধা দেয়। প্রথমে, আমি ভেবেছিলাম সম্ভবত @objc
আপনার প্রোটোকল এক্সটেনশনে অনুমতি দেওয়া হয়নি কারণ সুইফ্ট কমলারটি গ্যারান্টি দিতে পারে না যে অনুকরণীয় ধরণের শ্রেণি হবে (যদিও আপনি সুনির্দিষ্টভাবে উল্লেখ করেছেন UIViewController
)। তাই আমি একটি রাখাclass
প্রয়োজনীয়তা রাখা P1
। এটি কার্যকর হয়নি।
সম্ভবত একমাত্র কাজটি এখানে প্রোটোকলের পরিবর্তে কেবল বেস ক্লাস ব্যবহার করা, তবে এটি অবশ্যই পুরোপুরি আদর্শ নয় কারণ কোনও শ্রেণিতে কেবলমাত্র একটি বেস বেস শ্রেণি থাকতে পারে তবে একাধিক প্রোটোকলের সাথে সামঞ্জস্য থাকতে পারে।
আপনি যদি এই রাস্তাটিতে যেতে চান, দয়া করে এই প্রশ্নটি ( সাবক্লাসে কল করা হয়নি এমন সুইফট 3 ওবিজিসি ptionচ্ছিক প্রোটোকল পদ্ধতি ) গ্রহণ করুন। এটি প্রদর্শিত হয় যে সুইফ্ট 3-এ আর একটি বর্তমান সমস্যা হ'ল সাবক্লাসগুলি তাদের সুপারক্লাসের automaticallyচ্ছিক প্রোটোকলের প্রয়োজনীয়করণের প্রয়োগগুলি স্বয়ংক্রিয়ভাবে উত্তরাধিকার সূত্রে প্রাপ্ত হয় না। এই প্রশ্নের উত্তর তার @objc
চারপাশে পেতে একটি বিশেষ অভিযোজন ব্যবহার করে।
ইস্যু রিপোর্ট করা
আমি মনে করি সুইফট ওপেন সোর্স প্রকল্পগুলিতে যারা কাজ করছেন তাদের মধ্যে এটি ইতিমধ্যে আলোচনা করা হয়েছে, তবে আপনি নিশ্চিত হতে পারেন যে তারা অ্যাপল এর বাগ রিপোর্টার ব্যবহার করে সচেতন হয়েছে , যা সম্ভবত অবশেষে সুইফট কোর টিম বা সুইফটের বাগ রিপোর্টারটিতে প্রবেশ করবে । এর মধ্যে উভয়ই আপনার বাগটি খুব বিস্তৃত বা ইতিমধ্যে পরিচিত হিসাবে দেখতে পাবে। আপনি কী নতুন ভাষা বৈশিষ্ট্য হিসাবে সন্ধান করছেন তা সুইফট টিমও বিবেচনা করতে পারে, সেক্ষেত্রে আপনার প্রথমে মেলিং তালিকাটি পরীক্ষা করা উচিত ।
হালনাগাদ
ডিসেম্বর 2016 সালে এই বিষয়টি রিপোর্ট করা হয়েছিল সুইফট সম্প্রদায়ে। সমস্যাটি এখনও মাঝারি অগ্রাধিকার সহ খোলা হিসাবে চিহ্নিত হয়েছে, তবে নিম্নলিখিত মন্তব্যটি যুক্ত করা হয়েছিল:
এটা উদ্দেশ্য। প্রতিটি অ্যাডাপ্টারের সাথে পদ্ধতির বাস্তবায়ন যুক্ত করার কোনও উপায় নেই, যেহেতু প্রোটোকলে কনফরমেশন হওয়ার পরে এক্সটেনশনটি যুক্ত করা যেতে পারে। আমি মনে করি প্রোটোকলের মতো একই মডিউলে প্রসারণ করা থাকলে আমরা এটির অনুমতি দিতে পারি।
যেহেতু আপনার প্রোটোকলটি আপনার এক্সটেনশনের একই মডিউলে রয়েছে, তবে আপনি সুইফটের ভবিষ্যতের সংস্করণে এটি করতে সক্ষম হতে পারেন।
আপডেট 2
ফেব্রুয়ারী 2017 এ, এই বার্তাটি নীচে বার্তা সহ সুইফট কোর দলের একজন সদস্য কর্তৃক "উইল ডু" হিসাবে আনুষ্ঠানিকভাবে বন্ধ হয়েছিল:
এটি ইচ্ছাকৃত: প্রোটোকল এক্সটেনশানগুলি উদ্দেশ্য-সি রানটাইমের সীমাবদ্ধতার কারণে @objc এন্ট্রি পয়েন্টগুলি প্রবর্তন করতে পারে না। আপনি যদি এনওএসবজেক্টে @objc এন্ট্রি পয়েন্টগুলি যুক্ত করতে চান তবে এনএসবজেক্ট বাড়িয়ে দিন।
প্রসারিত NSObject
বা এমনকিUIViewController
আপনি যা চান ঠিক তা সম্পাদন করবে না, তবে দুর্ভাগ্যক্রমে এটি সম্ভবত সম্ভব হবে বলে মনে হচ্ছে না।
(খুব) দীর্ঘমেয়াদী ভবিষ্যতে, আমরা @objc
পুরোপুরি পদ্ধতিগুলির উপর নির্ভরতা দূর করতে সক্ষম হতে পারি তবে কোকো ফ্রেমওয়ার্কগুলি বর্তমানে সুইফটে লিখিত না হওয়ার পরে খুব শীঘ্রই সেই সময়টি আসবে না (এবং এটির স্থিতিশীল এবিআই না হওয়া পর্যন্ত হতে পারে না) ।
আপডেট 3
পতন 2019 হিসাবে, এটি কোনও সমস্যার কম হয়ে উঠছে কারণ আরও বেশি অ্যাপল ফ্রেমওয়ার্কগুলি সুইফটে লেখা হচ্ছে। উদাহরণস্বরূপ, আপনি যদি এর SwiftUI
পরিবর্তে ব্যবহার করেন তবে আপনি UIKit
সমস্যার পুরোপুরি মুখ ঘুরিয়ে ফেলুন কারণ @objc
কোনও SwiftUI
পদ্ধতির উল্লেখ করার সময় কখনই প্রয়োজন হবে না ।
সুইফটে লেখা অ্যাপল ফ্রেমওয়ার্কগুলির মধ্যে রয়েছে:
- সুইফটুই
- রিয়ালিটিকিট
- একত্রিত
- ক্রিপ্টোকিট
এখন সময়ের সাথে সাথে এই প্যাটার্নটি অব্যাহত থাকবে বলে আশা করা যায় যে সুইফট আনুষ্ঠানিকভাবে এবিআই এবং সুইফট যথাক্রমে 5.0 এবং 5.1 হিসাবে স্থিতিশীল।
@objc