নন - '@ অবজেক' পদ্ধতি '@objc' প্রোটোকলের alচ্ছিক প্রয়োজনীয়তা পূরণ করে না


107

ওভারভিউ:

  • আমার কাছে একটি প্রোটোকল পি 1 রয়েছে যা উদ্দেশ্য-সি alচ্ছিক ফাংশনগুলির একটির ডিফল্ট বাস্তবায়ন সরবরাহ করে।
  • আমি যখন alচ্ছিক ফাংশনটির একটি ডিফল্ট প্রয়োগ করি তখন একটি সতর্কতা উপস্থিত থাকে

সংকলক সতর্কতা:

Non-'@objc' method 'presentationController(_:viewControllerForAdaptivePresentationStyle:)' does not satisfy optional requirement of '@objc' protocol 'UIAdaptivePresentationControllerDelegate'

সংস্করণ:

  • সুইফট: 3
  • এক্সকোড: 8 (সর্বজনীন প্রকাশ)

চেষ্টা করা হয়েছে:

  • যোগ করার চেষ্টা করেছেন @objcকিন্তু সহায়তা করেন না

প্রশ্ন:

  • আমি কীভাবে এটি সমাধান করব?
  • এখানে কি কাজ আছে ?

কোড:

@objc protocol P1 : UIAdaptivePresentationControllerDelegate {

}

extension P1 where Self : UIViewController {

    func presentationController(_ controller: UIPresentationController, viewControllerForAdaptivePresentationStyle style: UIModalPresentationStyle) -> UIViewController? {
        return UIViewController()
    }
}


class A : UIViewController, P1 {

}

আপনার কাছে কি এক্সকোডের নতুন সংস্করণ রয়েছে? আমি সরিয়ে দিলে আমি কোনও ত্রুটি পাই না@objc
Qbyte

আমি এক্সকোড 8 (সর্বশেষ সর্বজনীন সংস্করণ) ব্যবহার করছি। কোনও ত্রুটি নেই, তবে একটি সতর্কতা থাকবে
ব্যবহারকারী 1046037

উত্তর:


186

যদিও আমি মনে করি আমি আপনার প্রশ্নের উত্তর দিতে পারি, এটি আপনার পছন্দ হবে এমন কোনও উত্তর নয়।

টিএল; ডিআর: @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 হিসাবে স্থিতিশীল।


4
@ ব্যবহারকারী 1046037 আমি পাশাপাশি করছি, কারণ আমি দেখতে পাচ্ছি ভবিষ্যতের বিকাশে এই সমস্যাটিতে নিজেকে অনেকবার চালিত করা।
ম্যাথু সিমন

4
আপনি সঠিক, Swift 4এখন পর্যন্ত অন্য কোনও বিকল্প সত্ত্বেও আপনার উত্তরটি এখনও ভাল ।
ব্যবহারকারী 1046037

4
আমার কাছে ঠিক একই কোডটি কিছুক্ষণের জন্য কাজ করছে তবে এক্সকোডের পরবর্তী প্রকাশে ব্রেকিং করেছে। এটি বেশ অনুপ্রেরণাদায়ক। অবজেক্টিভ-সি প্রোটোকলগুলিতে অনেকগুলি alচ্ছিক পদ্ধতি রয়েছে।
Departamento বি

1

আমি ব্যবহৃত সুইফট ফ্রেমওয়ার্কটিতে 'মডিউল স্থিতিশীলতা' ('বিতরণের জন্য লাইব্রেরিগুলি তৈরি করা' চালু) সক্ষম করার পরে আমি কেবল এতে প্রবেশ করি।

আমার যা ছিল তা কিছুটা ছিল:

class AwesomeClass: LessAwesomeClass {
...
}

extension AwesomeClass: GreatDelegate {
  func niceDelegateFunc() {
  }
}

এক্সটেনশনের ফাংশনে এই ত্রুটিগুলি ছিল:

  • 'লেসএউজিনিউজক্লাস' এর সাবক্লাসের সম্প্রসারণে '@objc' উদাহরণ পদ্ধতিটির জন্য আইওএস 13.0.0 প্রয়োজন

  • নন- '@ অবজেক্ট' পদ্ধতি 'সুন্দরডেলিগেটফঙ্ক' '@objc' প্রোটোকল 'গ্রেটডেলিগেট' এর প্রয়োজনীয়তা পূরণ করে না

বর্ধিতকরণের পরিবর্তে শ্রেণিতে ফাংশন স্থানান্তরিত করা সমস্যার সমাধান করে।


0

এখানে আরও একটি কাজ আছে। আমিও এই ইস্যুতে দৌড়েছি এবং এখনও ইউআইকিট থেকে সুইফটইউতে যেতে পারি না। ডিফল্ট বাস্তবায়নগুলি একটি সাধারণ বেস শ্রেণিতে স্থানান্তর করা আমার পক্ষেও বিকল্প ছিল না। আমার ডিফল্ট বাস্তবায়নগুলি বেশ বিস্তৃত ছিল তাই আমি সত্যিই সমস্ত কোডটি নকল করতে চাইনি। প্রোটোকলটিতে মোড়ক ফাংশন ব্যবহার করা এবং যে ক্লাসটি আমি ব্যবহার করে শেষ করেছি তা হ'ল প্রতিটি ক্লাসের সেই ফাংশনগুলিকে কেবল কল করুন। সুন্দর নয়, তবে পরিস্থিতি অনুসারে বিকল্পের চেয়ে ভাল হতে পারে। আপনার কোডটি এর পরে এমন কিছু দেখাচ্ছে:

@objc protocol P1 : UIAdaptivePresentationControllerDelegate {
}

extension P1 where Self : UIViewController {
    func wrapPresentationController(_ controller: UIPresentationController, viewControllerForAdaptivePresentationStyle style: UIModalPresentationStyle) -> UIViewController? {
        return UIViewController()
    }
}

class A : UIViewController, P1 {
    func presentationController(_ controller: UIPresentationController, viewControllerForAdaptivePresentationStyle style: UIModalPresentationStyle) -> UIViewController? {
        return wrapPresentationController(controller, viewControllerForAdaptivePresentationStyle: style)
    }
}
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.