দ্রুততম প্রতিনিধিরা?


132

একজন কীভাবে একজন প্রতিনিধি তৈরির বিষয়ে অর্থাত্ NSUserNotificationCenterDelegateত্বরান্বিত হয়?


4
আপনার অর্থ কি কোনও প্রতিনিধি বাস্তবায়ন করা বা নিজের প্রতিনিধি সংজ্ঞা দেওয়া?
ড্র্যাগ করুন

উত্তর:


72

এটি আপত্তি-সি থেকে আলাদা নয়। প্রথমত, আপনাকে নিম্নলিখিত শ্রেণীর ঘোষণায় আপনার প্রোটোকলটি নির্দিষ্ট করতে হবে:

class MyClass: NSUserNotificationCenterDelegate

বাস্তবায়ন নীচের মত দেখতে হবে:

// NSUserNotificationCenterDelegate implementation
func userNotificationCenter(center: NSUserNotificationCenter, didDeliverNotification notification: NSUserNotification) {
    //implementation
}

func userNotificationCenter(center: NSUserNotificationCenter, didActivateNotification notification: NSUserNotification) {
    //implementation
}

func userNotificationCenter(center: NSUserNotificationCenter, shouldPresentNotification notification: NSUserNotification) -> Bool {
    //implementation
    return true
}

অবশ্যই, আপনি প্রতিনিধি সেট করতে হবে। উদাহরণ স্বরূপ:

NSUserNotificationCenter.defaultUserNotificationCenter().delegate = self;

1
আপনি যখন ইউআইভিউউকন্ট্রোলারটি প্রসারিত করতে চান, তখন কী ঘটে, উদাহরণস্বরূপ, উদ্দেশ্য- @interface MyCustomClass: UIViewController <ClassIWantToUseDelegate>সিতে, আপনার কাছে এই মিথ্যাটি কিছু থাকতে পারে , যা আপনাকে ভিউকন্ট্রোলারের সূচনা / কনফিগার করতে, পাশাপাশি সাবউভিউগুলিতে ডেলিগেট পদ্ধতিগুলি কল করতে দেয়? কিছু অনুরূপ এই ?
মাহমুদ আহমদ

1
হাই অ্যাডাম, দ্রুত প্রশ্ন, আমি কীভাবে ডেলিগেট = স্ব নির্ধারণ করতে পারি, যদি আমি কোনও বস্তু ইনস্ট্যান্ট করতে না পারি কারণ এটি একটি জেনেরিক শ্রেণি যা আমার অন্যান্য ক্লাসে অ্যাক্সেস পায় না, তবুও আমি জেনেরিক শ্রেণিতে একটি ফাংশন কল করতে চাই অন্য শ্রেণি, তাই প্রতিনিধি প্রয়োজন?
মেরিন

234

দু'জন ভিউ কন্ট্রোলারের মধ্যে প্রতিনিধিদের সম্পর্কে এখানে একটু সহায়তা দেওয়া হয়েছে:

পদক্ষেপ 1: ইউআইভিউউকন্ট্রোলারে এমন একটি প্রোটোকল তৈরি করুন যা আপনি মুছে ফেলবেন / ডেটা প্রেরণ করবেন।

protocol FooTwoViewControllerDelegate:class {
    func myVCDidFinish(_ controller: FooTwoViewController, text: String)
}

Step2: পাঠানোর ক্লাসে প্রতিনিধি ঘোষণা (অর্থাত UIViewcontroller)

class FooTwoViewController: UIViewController {
    weak var delegate: FooTwoViewControllerDelegate?
    [snip...]
}

স্টিপি 3: প্রাপ্তি পদ্ধতিতে ডেটা প্রেরণ করতে একটি শ্রেণি পদ্ধতিতে প্রতিনিধি ব্যবহার করুন, যা প্রোটোকল গ্রহণ করে এমন কোনও পদ্ধতি।

@IBAction func saveColor(_ sender: UIBarButtonItem) {
        delegate?.myVCDidFinish(self, text: colorLabel.text) //assuming the delegate is assigned otherwise error
}

পদক্ষেপ 4: গ্রাহক শ্রেণিতে প্রোটোকল গ্রহণ করুন

class ViewController: UIViewController, FooTwoViewControllerDelegate {

পদক্ষেপ 5: প্রতিনিধি পদ্ধতিটি কার্যকর করুন

func myVCDidFinish(_ controller: FooTwoViewController, text: String) {
    colorLabel.text = "The Color is " +  text
    controller.navigationController.popViewController(animated: true)
}

পদক্ষেপ:: প্রস্তুতির জন্য প্রতিনিধি নির্ধারণ করুনসেগ:

override func prepare(for segue: UIStoryboardSegue, sender: Any?) {
    if segue.identifier == "mySegue" {
        let vc = segue.destination as! FooTwoViewController
        vc.colorString = colorLabel.text
        vc.delegate = self
    }
}

এবং এটি কাজ করা উচিত। এটি অবশ্যই কেবল কোড টুকরা, তবে আপনাকে ধারণা দেওয়া উচিত। এই কোডটির দীর্ঘ ব্যাখ্যার জন্য আপনি আমার ব্লগ এন্ট্রিতে এখানে যেতে পারেন:

segues এবং প্রতিনিধিদের

আপনি যদি কোনও প্রতিনিধিটির সাথে হুডের নীচে কী চলছে সে বিষয়ে আগ্রহী হন তবে আমি এখানে এটি লিখেছিলাম:

প্রতিনিধিদের সাথে ফণা অধীনে


23
পদক্ষেপ 2 প্রতিনিধি সম্পর্কে দুর্বল উল্লেখ থাকতে হবে? আমি যদি ঠিক আছি তবে এটি সম্পাদনা করুন। বিটিডব্লিউ আপনি এটি optionচ্ছিক মান করতে পারেন। এটি আরও দ্রুত হবে। দুর্বল var প্রতিনিধি: FooTwoViewControllerDelegate? পিএস: প্রতিনিধিটি বজায় রাখা বৃত্তের দুর্বল গুণ হতে হবে, সন্তানের উচিত পিতামাতার প্রতি দৃ strong় উল্লেখ রাখা উচিত
শিয়াল

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

4
ডেলিগেট প্রোটোকল FooTwoViewControllerDelegate: শ্রেণি {}
কোডিংয়েরথম

আপনি দয়া করে ভিসি আপনি ভিসি 1 এবং ভিসি 2 এর মতো প্রতিটি পদক্ষেপের দ্বারা সেট করতে পারেন। এগুলি কোথায় রাখা উচিত তা আমি নিশ্চিত নই।
সিঙ্গল

2
@ শিয়াল - আসলে এটি কিছুটা জটিল বলে মনে হচ্ছে। weakস্ট্রাক্ট এবং এনামগুলি নয় কেবল ক্লাসগুলির জন্য প্রয়োজনীয়। যদি প্রতিনিধি কোনও স্ট্রাক্ট বা এনাম হতে চলেছে তবে আপনার ধরে রাখার চক্র সম্পর্কে চিন্তা করার দরকার নেই। যাইহোক, এটির একটি শ্রেণীর প্রতিনিধি দিন (এটি বেশিরভাগ ক্ষেত্রে এর একটি ভিউকন্ট্রোলার হওয়ার কারণে এটি বেশিরভাগ ক্ষেত্রে সত্য) তবে আপনার প্রয়োজন weakতবে আপনার প্রোটোকলকে শ্রেণি হিসাবে ঘোষণা করা দরকার। এখানে আরও তথ্য রয়েছে স্ট্যাকওভারফ্লো.com
রবার্ট

94

প্রতিনিধিরা সর্বদা আমাকে বিভ্রান্ত করেন যতক্ষণ না আমি বুঝতে পারি যে একটি প্রতিনিধি মাত্র একটি শ্রেণি যা অন্য শ্রেণীর জন্য কিছু কাজ করে । এটি অন্য কারও কাছে থাকার মতো যা আপনার জন্য সমস্ত নোংরা কাজ করে যা আপনি নিজেরাই করতে চান না।

আমি এটি বর্ণনা করার জন্য একটি ছোট গল্প লিখেছি। আপনার পছন্দ হলে এটি কোনও খেলার মাঠে পড়ুন।

একদা...

// MARK: Background to the story

// A protocol is like a list of rules that need to be followed.
protocol OlderSiblingDelegate: class {
    // The following command (ie, method) must be obeyed by any 
    // underling (ie, delegate) of the older sibling.
    func getYourNiceOlderSiblingAGlassOfWater()
}

// MARK: Characters in the story

class BossyBigBrother {
    
    // I can make whichever little sibling is around at 
    // the time be my delegate (ie, slave)
    weak var delegate: OlderSiblingDelegate?
    
    func tellSomebodyToGetMeSomeWater() {
        // The delegate is optional because even though 
        // I'm thirsty, there might not be anyone nearby 
        // that I can boss around.
        delegate?.getYourNiceOlderSiblingAGlassOfWater()
    }
}

// Poor little sisters have to follow (or at least acknowledge) 
// their older sibling's rules (ie, protocol)
class PoorLittleSister: OlderSiblingDelegate {

    func getYourNiceOlderSiblingAGlassOfWater() {
        // Little sis follows the letter of the law (ie, protocol),
        // but no one said exactly how she had to respond.
        print("Go get it yourself!")
    }
}

// MARK: The Story

// Big bro is laying on the couch watching basketball on TV.
let bigBro = BossyBigBrother()

// He has a little sister named Sally.
let sally = PoorLittleSister()

// Sally walks into the room. How convenient! Now big bro 
// has someone there to boss around.
bigBro.delegate = sally

// So he tells her to get him some water.
bigBro.tellSomebodyToGetMeSomeWater()

// Unfortunately no one lived happily ever after...

// The end.

পর্যালোচনাতে, প্রতিনিধি নিদর্শন তৈরি এবং ব্যবহারের জন্য তিনটি মূল অংশ রয়েছে।

  1. প্রোটোকল যে সংজ্ঞায়িত কি কর্মী কাজ অনুযায়ী
  2. মনিব বর্গ , একটি প্রতিনিধি পরিবর্তনশীল আছে যা যা এটি ব্যবহার করে কি করতে হবে তা শ্রমিক শ্রেণী বলতে
  3. কর্মী বর্গ যে প্রোটোকল গ্রহণ করে এবং কি প্রয়োজন বোধ করা হয় না

বাস্তব জীবন

উপরের আমাদের বোসি বিগ ব্রাদার গল্পের তুলনায় প্রতিনিধিরা প্রায়শই নিম্নলিখিত ব্যবহারিক প্রয়োগগুলির জন্য ব্যবহৃত হয়:

  1. যোগাযোগ : এক শ্রেণির কিছু তথ্য অন্য শ্রেণিতে প্রেরণ করা দরকার।
  2. কাস্টমাইজেশন : এক শ্রেণি অন্য শ্রেণিকে এটি কাস্টমাইজ করার অনুমতি দিতে চায়।

দারুণ অংশটি হ'ল এই ক্লাসগুলির আগে থেকেই একে অপরের সম্পর্কে কিছু জানার দরকার নেই, তবে ডেলিগেট ক্লাস প্রয়োজনীয় প্রোটোকলের সাথে সম্মত হয়।

আমি নিম্নলিখিত দুটি নিবন্ধ পড়ার অত্যন্ত পরামর্শ দিচ্ছি। তারা আমাকে ডকুমেন্টেশনগুলির চেয়ে আরও ভালভাবে প্রতিনিধিদের বুঝতে সাহায্য করেছিল ।

আরও একটি নোট

রেফারেন্স দেয় যে অন্যান্য শ্রেণিগুলির মালিকানা তাদের নেই, weakশক্তিশালী রেফারেন্স চক্র এড়াতে কীওয়ার্ডটি ব্যবহার করা উচিত । আরও তথ্যের জন্য এই উত্তর দেখুন ।


3
শেষ পর্যন্ত এমন কেউ যিনি প্রোটোকল ব্যাখ্যা করতে পারেন এবং সাধারণ জ্ঞানের সাথে প্রতিনিধিত্ব করতে পারেন! ধন্যবাদ মানুষ!
Engineeroholic

যখন বোসি বিগ ব্রাদার জানেন না যে সে ভাই (জেনারিক্স)?
মেরিন

@ মেরিন, আমি আপনার প্রশ্নটি বুঝতে পেরেছি তা নিশ্চিত নয়। বিধিগুলির তালিকা (প্রোটোকল) কে বিবেচনা করে না যে এটি কে নিয়মগুলি অনুসরণ করার জন্য আহ্বান জানিয়েছে বা কে নিয়ম অনুসরণ করছে। তারা কেবল নিয়ম।
সুরগচ

মূলত আমি আমার প্রশ্নটির উল্লেখ করছি, এখানে কিছুটা সরলীকৃত। stackoverflow.com/questions/41195203/…
মেরিন

47

আমি @ মেক অ্যাপপি পোস্ট করার জন্য কিছু সংশোধন পেয়েছি

প্রথমে আপনি যখন ডেলিগেট প্রোটোকল তৈরি করছেন তখন এটি ক্লাস প্রোটোকলের সাথে সঙ্গতিপূর্ণ হওয়া উচিত। নীচের উদাহরণে পছন্দ করুন।

protocol ProtocolDelegate: class {
    func myMethod(controller:ViewController, text:String)
}

দ্বিতীয়ত, ধরে রাখার চক্র এড়াতে আপনার প্রতিনিধি দুর্বল হওয়া উচিত।

class ViewController: UIViewController {
    weak var delegate: ProtocolDelegate?
}

শেষ, আপনি সুরক্ষিত কারণ আপনার প্রোটোকলটি একটি alচ্ছিক মান। তার মানে এর "নিল" বার্তাটি এই সম্পত্তিটিতে প্রেরণ করা হবে না। এটি respondToselectorঅবজেক্টে শর্তযুক্ত বক্তব্যের অনুরূপ তবে এখানে আপনার কাছে সমস্ত কিছু এক লাইনে রয়েছে:

if ([self.delegate respondsToSelector:@selector(myMethod:text:)]) {
    [self.delegate myMethod:self text:@"you Text"];
}

উপরে আপনার একটি আপত্তি-সি উদাহরণ রয়েছে এবং নীচে আপনার দেখতে এটির স্যুইফ্ট উদাহরণ রয়েছে।

delegate?.myMethod(self, text:"your Text")

আপনি নিরাপদ কারণ আপনার প্রোটোকলটি একটি alচ্ছিক মান ..... কারণ আপনি useচ্ছিক শৃঙ্খলা ব্যবহার করুন delegate?.myMethodক্রাশ হবে না কারণ যদি প্রতিনিধি হয় nilতবে কিছুই হবে না। তবে আপনি যদি ভুল করেছেন এবং লিখেছেন যে কোনও প্রতিনিধি সেট না করা থাকলে delegate!.myMethodআপনি ক্র্যাশ করতে পারেন, সুতরাং এটি আপনার সুরক্ষার জন্য মূলত একটি উপায় ...
হানি

32

এখানে আমি একটি সংক্ষেপ লিখেছি। আমি একই ভাবছিলাম এবং এটি আমার বোঝার উন্নতি করতে সহায়তা করেছিল। কী চলছে তা দেখার জন্য এটি একটি এক্সকোড প্লেগ্রাউন্ডে খুলুন ।

protocol YelpRequestDelegate {
    func getYelpData() -> AnyObject
    func processYelpData(data: NSData) -> NSData
}

class YelpAPI {
    var delegate: YelpRequestDelegate?

    func getData() {
        println("data being retrieved...")
        let data: AnyObject? = delegate?.getYelpData()
    }

    func processYelpData(data: NSData) {
        println("data being processed...")
        let data = delegate?.processYelpData(data)
    }
}

class Controller: YelpRequestDelegate {
    init() {
        var yelpAPI = YelpAPI()
        yelpAPI.delegate = self
        yelpAPI.getData()
    }
    func getYelpData() -> AnyObject {
        println("getYelpData called")
        return NSData()
    }
    func processYelpData(data: NSData) -> NSData {
        println("processYelpData called")
        return NSData()
    }
}

var controller = Controller()

এটা খুবই পছন্দ করি. খুব সহায়ক
অ্যাস্পেন

@ সিএমকোড হাই, এটি প্রথমে ভাল উদাহরণ ছিল, তবে আমার এখনও একটি সমস্যা আছে। আমি যে কোনও UIViewControllerক্লাসকে আমাদের তৈরি প্রতিনিধি অনুসারে তৈরি করতে পারি? সেগুলি কি একটি সুইফ্ট ফাইলে ঘোষণা করতে হবে? যে কোনও সাহায্যের অর্থ অনেক বেশি।
ফারুক

@ ফারুক এটি পোস্ট করার পরে কিছুক্ষণ হয়েছে, তবে আমি মনে করি আপনি যা বলছেন তা খুব সহজ হওয়া উচিত (যদি আমি ভুল বোঝাবুঝি করি তবে আমি ক্ষমা চাই)। কোলনের পরে আপনার ইউআইভিউউকন্ট্রোলারে কেবল প্রতিনিধি যুক্ত করুন। তাই কিছু class ViewController : UIViewController NameOfDelegate
মেমকোড

@ সিএমকোড হ্যাঁ, আপনি আমার প্রশ্নটি ভালভাবে পেয়েছেন। আমি আপনার পরামর্শটি বিটিডব্লিউ দিয়েছি, কিন্তু যখন আমি a.swiftউপরে আপনার উত্তর অনুসারে একটি প্রতিনিধি শ্রেণি তৈরি করি তখন তা আসে না b.swift। আমি আমার সুইফট ফাইলের বাইরে কোনও ক্লাসে পৌঁছতে পারি না। কোন কড়া?
ফারুক

একটি জিনিস যা আমি বুঝতে পারি না তা হল কেন আমি ইয়েলপাপির একটি নতুন উদাহরণ তৈরি করব যাতে আমি ইয়েলপির প্রতিনিধিকে ডাকি? যদি এই চলমান উদাহরণটি সবেমাত্র তৈরি করা 'নতুন' থেকে আলাদা হয় ... কীভাবে এটি কীভাবে জানবে যে কোন প্রতিনিধি ইয়েলপি-র কোন উদাহরণটির অন্তর্গত?
মেরিন

15

সুইফট 2 ডিফল্ট

আমি দুটি ভিউ নিয়ন্ত্রণকারীদের সাথে ডেলিগেটের উদাহরণ দিয়ে ব্যাখ্যা করছি this এই ক্ষেত্রে, সেকেন্ডভিসি অবজেক্টটি প্রথম ভিউ কন্ট্রোলারে ডেটা প্রেরণ করছে।

প্রোটোকল ঘোষণা সহ ক্লাস

protocol  getDataDelegate  {
    func getDataFromAnotherVC(temp: String)
}


import UIKit
class SecondVC: UIViewController {

    var delegateCustom : getDataDelegate?
    override func viewDidLoad() {
        super.viewDidLoad()
     }

    override func didReceiveMemoryWarning() {
        super.didReceiveMemoryWarning()
        // Dispose of any resources that can be recreated.
    }
    @IBAction func backToMainVC(sender: AnyObject) {
      //calling method defined in first View Controller with Object  
      self.delegateCustom?.getDataFromAnotherVC("I am sending data from second controller to first view controller.Its my first delegate example. I am done with custom delegates.")
        self.navigationController?.popViewControllerAnimated(true)
    }

}

প্রথম ভিউ কন্ট্রোলার প্রোটোকল অনুসারে এখানে সম্পন্ন করা হয়:

class ViewController: UIViewController, getDataDelegate

ফার্স্ট ভিউ কন্ট্রোলারে প্রোটোকল পদ্ধতির সংজ্ঞা (ViewController)

func getDataFromAnotherVC(temp : String)
{
  // dataString from SecondVC
   lblForData.text = dataString
}

ফার্স্ট ভিউ কন্ট্রোলার (ভিউকন্ট্রোলার) থেকে সেকেন্ডভিসিকে চাপ দেওয়ার সময়

let objectPush = SecondVC()
objectPush.delegateCustom = self
self.navigationController.pushViewController(objectPush, animated: true)

আপনার শেষ 3 টি লাইন আমার পরিস্থিতি বুঝতে এবং আমার সমস্যা সমাধান করতে সহায়তা করেছে। ধন্যবাদ মানুষ! :)
iHarshil

6

প্রথম শ্রেণি:

protocol NetworkServiceDelegate: class {

    func didCompleteRequest(result: String)
}


class NetworkService: NSObject {

    weak var delegate: NetworkServiceDelegate?

    func fetchDataFromURL(url : String) {
        delegate?.didCompleteRequest(url)
    }
}

দ্বিতীয় শ্রেণী:

class ViewController: UIViewController, NetworkServiceDelegate {

    let network = NetworkService()

    override func viewDidLoad() {
        super.viewDidLoad()
        network.delegate = self
        network.fetchDataFromURL("Success!")
    }



    func didCompleteRequest(result: String) {
        print(result)
    }


}

উপরের কোডটি সংকলন করার সময় এটি ত্রুটি Type 'ViewController' does not conform to protocol 'NetworkServiceDelegate'plz প্রস্তাব দেখায় । এটি আমার দ্রুতগতিতে 6th ষ্ঠ দিন :)
বৈভব শরণ

4

ধাপে ধাপে খুব সহজ পদক্ষেপ (100% কাজ এবং পরীক্ষিত)

পদক্ষেপ 1: প্রথম দেখা নিয়ন্ত্রকের উপর পদ্ধতি তৈরি করুন

 func updateProcessStatus(isCompleted : Bool){
    if isCompleted{
        self.labelStatus.text = "Process is completed"
    }else{
        self.labelStatus.text = "Process is in progress"
    }
}

পদক্ষেপ 2: দ্বিতীয় দর্শন নিয়ামককে চাপ দেওয়ার সময় প্রতিনিধি সেট করুন

@IBAction func buttonAction(_ sender: Any) {

    let secondViewController = self.storyboard?.instantiateViewController(withIdentifier: "secondViewController") as! secondViewController
    secondViewController.delegate = self
    self.navigationController?.pushViewController(secondViewController, animated: true)
}

স্টিপি 3: প্রতিনিধি পছন্দ করুন like

শ্রেণি ভিউ কন্ট্রোলার : ইউআইভিউকন্ট্রোলার , প্রসেসস্ট্যাটাসডেলিগেট {

পদক্ষেপ 4: প্রোটোকল তৈরি করুন

protocol ProcessStatusDelegate:NSObjectProtocol{
func updateProcessStatus(isCompleted : Bool)
}

পদক্ষেপ 5: একটি পরিবর্তনশীল নিন

var delegate:ProcessStatusDelegate?

পদক্ষেপ:: পূর্ববর্তী ভিউ কন্ট্রোলার কল ডেলিগেট পদ্ধতিতে ফিরে যাওয়ার সময়ে ডেটা দিয়ে প্রথমে কন্ট্রোলারকে জানান

@IBAction func buttonActionBack(_ sender: Any) {
    delegate?.updateProcessStatus(isCompleted: true)
    self.navigationController?.popViewController(animated: true)
}

@IBAction func buttonProgress(_ sender: Any) {
    delegate?.updateProcessStatus(isCompleted: false)
    self.navigationController?.popViewController(animated: true)

}

3

সাধারণ উদাহরণ:

protocol Work: class {
    func doSomething()
}

class Manager {
    weak var delegate: Work?
    func passAlong() {
        delegate?.doSomething()
    }
}

class Employee: Work {
    func doSomething() {
        print("Working on it")
    }
}

let manager = Manager()
let developer = Employee()
manager.delegate = developer
manager.passAlong() // PRINTS: Working on it

আপনি প্রোটোকল বর্ণনায় কীওয়ার্ড "ক্লাস" ব্যবহার করেন? এটি ব্যবহার এবং ব্যবহার না করার মধ্যে পার্থক্য কী?
ভ্লাদ

2
শ্রেণীর কীওয়ার্ডের অর্থ এটি কেবলমাত্র একটি শ্রেণীর প্রোটোকল। ক্লাস কীওয়ার্ড যুক্ত করে আপনি প্রোটোকল গ্রহণ শ্রেণীর ধরণের, এবং কাঠামোগত বা গণনা নয় সীমাবদ্ধ করতে পারেন। কোনও বিভ্রান্তি এড়াতে আমার সম্ভবত এটি যুক্ত করা উচিত হয়নি তবে আপনি যেহেতু জিজ্ঞাসা করেছেন আমি তা রাখব।
ববি

2

প্রতিনিধিরা হ'ল একটি নকশার প্যাটার্ন যা কোনও নির্দিষ্ট ইভেন্ট ঘটলে একটি বস্তুকে অন্য কোনও বস্তুতে বার্তা প্রেরণ করতে দেয়। কোনও বস্তুটি কল্পনা করুন একটি ক্রিয়া সম্পাদনের জন্য একটি বস্তু বি কল করে। ক্রিয়াটি সম্পূর্ণ হয়ে গেলে, এ-এর অবজেক্টটি জানতে হবে যে বি কাজটি সম্পন্ন করেছে এবং প্রয়োজনীয় পদক্ষেপ নিয়েছে, প্রতিনিধিদের সহায়তায় এটি অর্জন করা যেতে পারে! এখানে একটি টিউটোরিয়াল বাস্তবায়ন প্রতিনিধিরা ধাপে ধাপে 3 3

টিউটোরিয়াল লিঙ্ক


0

উপরের সমাধানগুলি কিছুটা দম্পতিযুক্ত মনে হয়েছিল এবং একই সাথে অন্যান্য নিয়ন্ত্রকদের একই প্রোটোকলটিকে পুনরায় ব্যবহার করা এড়াতে হবে, এজন্যই আমি জেনেরিক টাইপ-ইরেজর ব্যবহার করে আরও শক্তিশালী টাইপযুক্ত সমাধানটি নিয়ে এসেছি।

@noreturn public func notImplemented(){
    fatalError("not implemented yet")
}


public protocol DataChangedProtocol: class{
    typealias DataType

    func onChange(t:DataType)
}

class AbstractDataChangedWrapper<DataType> : DataChangedProtocol{

    func onChange(t: DataType) {
        notImplemented()
    }
}


class AnyDataChangedWrapper<T: DataChangedProtocol> : AbstractDataChangedWrapper<T.DataType>{

    var base: T

    init(_ base: T ){
        self.base = base
    }

    override func onChange(t: T.DataType) {
        base.onChange(t)
    }
}


class AnyDataChangedProtocol<DataType> : DataChangedProtocol{

    var base: AbstractDataChangedWrapper<DataType>

    init<S: DataChangedProtocol where S.DataType == DataType>(_ s: S){
        self.base = AnyDataChangedWrapper(s)
    }

    func onChange(t: DataType) {
        base.onChange(t)
    }
}



class Source : DataChangedProtocol {
    func onChange(data: String) {
        print( "got new value \(data)" )
    }
}


class Target {
    var delegate: AnyDataChangedProtocol<String>?

    func reportChange(data:String ){
        delegate?.onChange(data)
    }
}


var source = Source()
var target = Target()

target.delegate = AnyDataChangedProtocol(source)
target.reportChange("newValue")    

আউটপুট : নতুন মান পেল নতুন ভ্যালু


আমি এই সম্পর্কে আরও জানতে আগ্রহী। আপনি যে পদগুলি ব্যবহার করেন সে সম্পর্কে আপনি আরও ব্যাখ্যা করতে পারেন: মিলিত, "একই প্রোটোকলটির পুনরায় ব্যবহার এড়ানো", "জেনেরিক টাইপ-ইরেজোর"। কেন এটিকে বিমূর্ত করা গুরুত্বপূর্ণ? কেউ কি সবসময় এই কাজ করা উচিত?
সুরগাচ

0

দ্রুত 4.0. এ

ক্লাসে এমন একটি প্রতিনিধি তৈরি করুন যাতে অন্যান্য ক্লাসে কিছু ডেটা প্রেরণের বা কিছু কার্যকারিতা সরবরাহ করতে হবে

মত

protocol GetGameStatus {
    var score: score { get }
    func getPlayerDetails()
}

ক্লাসে যে এই প্রতিনিধি নিশ্চিত করতে যাচ্ছি

class SnakesAndLadders: GetGameStatus {
    func getPlayerDetails() {

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