दिलचस्प पोस्ट
ggplot2: एक साजिश छँटाई मैं कैसे दो divs रखता हूँ जो एक ही ऊंचाई से एक तरफ है? सक्रिय बच्चे के माता-पिता के लिए जटिल सीएसएस चयनकर्ता उद्देश्य-सी में, मैं ऑब्जेक्ट प्रकार की जांच कैसे करूं? एक वीडियो से दूसरे को iPhone चिकना संक्रमण आप जावा में दिनांक कैसे घटाना चाहते हैं? MySQL का प्रयोग करके तीन तालिकाओं में शामिल हो रहा है PHPMailer – SMTP त्रुटि: मेरे सर्वर से मेल भेजते समय पासवर्ड कमांड विफल रहा I जावा में अगले शब्द पढ़ें क्या इनटस्टस्ट्रीम से टाइमआउट के साथ पढ़ना संभव है? त्रुटि: फ़ाइल एन्क्रिप्ट की गई है या कोई डेटाबेस नहीं है फायरबेज में कई रिश्तों में कई onKeyDown और onKeyLongPress स्विफ्ट एक्सटेंशन में ओवरराइड करने के तरीकों रेंज क्यों काम करती है, लेकिन सेल नहीं?

तेजी से प्रतिनिधि?

कोई प्रतिनिधि बनाने के बारे में कैसे जाता है, यानी NSUserNotificationCenterDelegate की गति तेज हो जाती है?

वेब के समाधान से एकत्रित समाधान "तेजी से प्रतिनिधि?"

यह ओबजे-सी से अलग नहीं है सबसे पहले, आपको अपनी क्लास घोषणा में प्रोटोकॉल को निर्दिष्ट करना होगा, जैसे निम्नलिखित:

 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: UIViewController में एक प्रोटोकॉल बनाओ जिसे आप डेटा भेजना / हटाएंगे।

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

चरण 2: भेजने वाले क्लास में प्रतिनिधि को घोषित करें (अर्थात यूआईवीआईसीआई नियंत्रक)

 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) } 

चरण 6: तैयार करें प्रतिनिधि में सेट करें FORSegue:

 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 और प्रतिनिधियों

यदि आप रुचि रखते हैं कि एक प्रतिनिधि के साथ हुड के चलते हैं, तो मैंने यहां लिखा था:

प्रतिनिधियों के साथ हुड के तहत

प्रतिनिधि हमेशा मुझे भ्रमित करते हैं जब तक मुझे एहसास नहीं हुआ कि एक प्रतिनिधि सिर्फ एक वर्ग है जो किसी अन्य वर्ग के लिए कुछ काम करता है । यह आपके लिए सभी गंदे काम करने के लिए किसी और के होने की तरह है कि आप स्वयं नहीं करना चाहते हैं

मैं इसे स्पष्ट करने के लिए एक छोटी कहानी लिखा था यदि आपको पसंद है तो इसे एक खेल का मैदान में पढ़ें।

एक ज़माने में…

 // 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. संचार : एक कक्षा को किसी अन्य वर्ग को कुछ जानकारी भेजने की आवश्यकता है।
    • कोड उदाहरण 1: डेटा को एक दृश्य नियंत्रक से दूसरे में भेजना
    • कोड उदाहरण 2: पाठ इनपुट को एक कस्टम कीबोर्ड से टेक्स्ट फ़ील्ड तक भेजना
  2. अनुकूलन : एक वर्ग दूसरे वर्ग को इसे अनुकूलित करने की अनुमति देना चाहता है।

महान हिस्सा यह है कि इन कक्षाओं को पहले से एक दूसरे के बारे में कुछ भी जानने की ज़रूरत नहीं है, इसके अलावा प्रतिनिधि वर्ग आवश्यक प्रोटोकॉल के अनुरूप है।

मैं अत्यधिक निम्न दो लेखों को पढ़ने की सलाह देता हूं उन्होंने मुझे डेलिगेटेशन की तुलना में बेहतर समझे जाने में मदद की

  • प्रतिनिधिमंडल क्या है? – एक स्विफ्ट डेवलपर की मार्गदर्शिका
  • डेलिगेशन वर्क्स – ए स्विफ्ट डेवलपर की मार्गदर्शिका

एक और नोट

प्रतिनिधि जो कि अन्य वर्गों का संदर्भ देते हैं जिन्हें वे स्वयं नहीं रखते, मजबूत संदर्भ चक्रों से बचने के लिए weak खोजशब्द का उपयोग करना चाहिए। अधिक जानकारी के लिए इस उत्तर को देखें।

मुझे @ मेकपपपी के पोस्ट के लिए कुछ सुधार हुए हैं

सबसे पहले जब आप प्रतिनिधि प्रोटोकॉल बना रहे हैं तो उसे क्लास प्रोटोकॉल के अनुरूप होना चाहिए। उदाहरण के नीचे की तरह

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

दूसरा, अपने प्रतिनिधि को चक्र बनाए रखने से बचने के लिए कमज़ोर होना चाहिए।

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

अंतिम, आप सुरक्षित हैं क्योंकि आपका प्रोटोकॉल एक वैकल्पिक मान है इसका मतलब है कि इसका "शून्य" संदेश इस संपत्ति पर नहीं भेजा जाएगा। यह respondToselector में respondToselector साथ सशर्त बयान के समान है, लेकिन यहां आपके पास एक पंक्ति में सब कुछ है:

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

आपके ऊपर एक obj-C उदाहरण है और नीचे आप स्विफ्ट उदाहरण है कि यह कैसा दिखता है।

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

यहाँ एक सार है जो मैंने एक साथ रखा था। मैं वही सोच रहा था और इसने मेरी समझ को बेहतर बनाने में मदद की यह देखने के लिए कि क्या चल रहा है यह एक एक्सकोड प्लेग्राउंड में खोलें।

 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() 

स्विफ्ट 2 में छूट

मैं दो दृश्य नियंत्रकों के साथ प्रतिनिधि के उदाहरण के साथ समझा रहा हूं। इस मामले में, द्वितीय सेकंड ऑब्जेक्ट पहले डेटा नियंत्रक को वापस डेटा भेज रहा है।

प्रोटोकॉल घोषणा के साथ कक्षा

 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 

प्रथम दृश्य नियंत्रक (व्यू नियंत्रक) में प्रोटोकॉल विधि परिभाषा

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

प्रथम दृश्य नियंत्रक (व्यू नियंत्रक) से द्वितीयवीं को पुश करने के दौरान

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

प्रथम श्रेणी:

 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) } } 

इसके बाद के समाधान एक छोटे से युग्मित लग रहे थे और साथ ही अन्य नियंत्रकों में एक ही प्रोटोकॉल का इस्तेमाल करने से बचने के लिए, यही कारण है कि मैं उस समाधान के साथ आया हूं जो सामान्य टाइप-विरर का उपयोग करके अधिक मजबूत टाइप किया गया है।

 @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") 

आउटपुट : मिला नया मान newValue

सरल उदाहरण:

 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 

स्विफ्ट 4.0 में

क्लास पर एक प्रतिनिधि बनाएं जिसे कुछ डेटा भेजने या अन्य वर्गों को कुछ कार्यक्षमता प्रदान करने की आवश्यकता होती है

पसंद

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

इसके बाद कक्षा में जो इस प्रतिनिधि को पुष्टि करने जा रहा है

 class SnakesAndLadders: GetGameStatus { func getPlayerDetails() { } } 

प्रतिनिधि एक डिज़ाइन पैटर्न हैं जो एक वस्तु को किसी अन्य ऑब्जेक्ट को संदेश भेजने की अनुमति देता है, जब कोई विशिष्ट ईवेंट होता है। किसी ऑब्जेक्ट की कल्पना करें ए को क्रिया करने के लिए ऑब्जेक्ट बी कॉल करता है। एक बार कार्रवाई पूरी हो जाने पर ऑब्जेक्ट ए को पता होना चाहिए कि बी ने कार्य पूरा कर लिया है और आवश्यक कार्रवाई की है, यह प्रतिनिधियों की मदद से हासिल की जा सकती है! यहाँ एक ट्यूटोरियल कार्यान्वयन प्रतिनिधि है जो तेज 3 में कदम है

ट्यूटोरियल लिंक