একটি প্রোটোকল কেবল নির্দিষ্ট শ্রেণীর দ্বারা গৃহীত হতে পারে কীভাবে এটি প্রয়োজন


91

আমি এই প্রোটোকলটি চাই:

protocol AddsMoreCommands {
     /* ... */
}

কেবল ক্লাস থেকে উত্তরাধিকার সূত্রে প্রাপ্ত ক্লাসগুলিই গৃহীত হবে UIViewController। এই পৃষ্ঠাটি আমাকে বলছে আমি উল্লেখ করতে পারি যে এটি কেবল কোনও শ্রেণীর দ্বারা গৃহীত হয়েছে (কাঠামোর বিপরীতে) লিখে by

protocol AddsMoreCommands: class {
}

তবে কীভাবে এটি প্রয়োজন তা কেবল একটি নির্দিষ্ট শ্রেণীর দ্বারা গৃহীত হয় তা আমি দেখতে পাচ্ছি না। সেই পৃষ্ঠাটি পরেwhere কনফরমেশন চেক করতে প্রোটোকল এক্সটেনশনে ক্লোজ যুক্ত করার বিষয়ে কথা বলছে তবে কীভাবে তা মানিয়ে নেব তা আমি দেখতে পাচ্ছি না।

extension AddsMoreCommands where /* what */ {
}

এই কাজ করতে একটি উপায় আছে কি? ধন্যবাদ!

উত্তর:


115
protocol AddsMoreCommands: class {
    // Code
}

extension AddsMoreCommands where Self: UIViewController {
    // Code
}

4
আমার প্রায় ছিল ... selfপরিবর্তে আমি লিখেছিলাম Self:-( আপনাকে অনেক ধন্যবাদ, যে ভাল কাজ করে!
— emrys57

আমার জন্য, যখন আমি কাস্টিংয়ের সাথে এটি ব্যবহার করি তখন এটি কিছু সিনট্যাকটিক অদ্ভুততার কারণ হয়।
— ক্রিস প্রিন্স

4
প্রোটোকলে আপনাকে কোনও সম্পত্তি অন্তর্ভুক্ত করার প্রয়োজন হলে এটি কাজ করবে না, কারণ এক্সটেনশনে সঞ্চিত বৈশিষ্ট্য থাকতে পারে না।
— শিম

4
এটি যথাযথভাবে সংরক্ষণ করতে পারে আপনার কেবল এটি ব্যবহার করতে হবে: objc_getAssociatedObject (স্ব, এবং কী নাম) হিসাবে? প্রপার্টিটাইপ
— মিশা জাইব্রো

যখন একটি লেট / ওয়ার ঘোষণাপত্রের টাইপ হয় AddsMoreCommandsতবে আপনি এটির একটি পদ্ধতি প্রত্যাশা করার জন্য একটি পদ্ধতি পাস করার প্রয়োজনও রয়েছেUIViewController
— GoatInTheMachine

80

এটি কোনও এক্সটেনশন ছাড়াই অর্জন করা যায়:

protocol AddsMoreCommands: class where Self: UIViewController {
   // code
}

সম্পাদনা করা হয়েছে 2017/11/04 : জিগ নির্দেশ করেছেন, এটি Xcode 9.1 এ একটি সতর্কতা উত্পন্ন করেছে বলে মনে হচ্ছে। সতর্কতাটি সরাতে বর্তমানে সুইফ্ট প্রকল্পে (এসআর -২656565) একটি সমস্যা আছে বলে আমি প্রতি নজর রাখব এবং সে অনুযায়ী উত্তরটি আপডেট করব।

সম্পাদিত 2018/09/29 : উদাহরণটিclass সংরক্ষণ করবে এমন ভেরিয়েবলটি দুর্বল করা প্রয়োজন (যেমন প্রতিনিধি)। আপনার যদি কোনও দুর্বল ভেরিয়েবলের প্রয়োজন না হয় তবে আপনি বাদ দিতে পারেন classএবং কেবল নীচে লিখতে পারেন এবং কোনও সতর্কতা থাকবে না:

protocol AddsMoreCommands where Self: UIViewController {
   // code
}

4
এটা কতটা কাকতালীয় যে আমি দু'বছরের পুরানো প্রশ্নের উপর ক্লিক করেছি এবং এক ঘন্টা আগে পোস্ট করা একটি নিখুঁত সমাধান পেয়েছি 😲
— অস্কার অ্যাপল্যান্ড

এক্সকোড 9.1 এখন আমাকে এই কথার সম্পর্কে একটি সতর্কতা দিচ্ছে: রিলান্ড্যান্ট লেআউট সীমাবদ্ধতা 'স্ব': 'যেকোনওজেক্ট'। বিন্যাস সীমাবদ্ধতা 'স্ব': 'যেকোনওবজেক্ট' এখানে নিহিত। আমার কোডটি গৃহীত উত্তরের বিন্যাসে পরিবর্তন করা আরও ভাল বলে মনে হচ্ছে।
— জিগ

4
এক্সকোড 9.1 হিসাবে ক্লাস-কেবল প্রোটোকলগুলির AnyObjectপরিবর্তে এখন ব্যবহার করুন class। protocol AddsMoreCommands: AnyObject where Self: UIViewController { // code }
— ডডজিও

@ ডডজিও এখনও একই সতর্কতা পেয়ে AnyObject
— যাচ্ছেন

4
@ ডেভিডপিজ্টর আপনি ঠিকই বলেছেন, তবে আপনি যদি সম্পত্তিটিকে দুর্বল করে তুলতে কোনও প্রতিনিধি হিসাবে কাঠামোগত প্যাটার্নে এটি ব্যবহার করতে চান তবে স্পষ্টভাবে ক্লাস´ যুক্ত করা প্রয়োজন :)
— rgkobashi

48

পূর্ববর্তী উত্তরের কোনও সমস্যার কারণে আমি এই ঘোষণা দিয়ে শেষ করেছি:

protocol AddsMoreCommands where Self : UIViewController { 
    // protocol stuff here  
}

এক্সকোড 9.1 এ কোনও সতর্কতা নেই


4
আমি ভুল হলে আমাকে সংশোধন করুন, তবে উপরের সমাধানটি নিয়ে এই সমস্যাটি (যা এক্সকোড 9.1 এবং উপরের দিকে একটি সতর্কবার্তা উত্পন্ন করছে), আপনি কি প্রতিনিধিটিকে দুর্বল হিসাবে ঘোষণা করতে পারবেন না?
— কাইল গোসলান

এছাড়াও, যখন আমি সুইফট 4.1 সঙ্গে এই সমাধান ব্যবহার করেন, আমি ঢালাই বৈশিষ্ট্য প্রয়োজন AddsMoreCommandsথেকে UIViewControllerযা আমি এড়াতে চেয়েছিলেন ...
— fl034

9
টাইপ কাস্ট এড়ানোর জন্য, আপনি এই কাজ করতে পারে:typealias AddsMoreCommandsViewController = UIViewController & AddsMoreCommands
— PLU

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