2011-03-25 19 views

Respuesta

74

Un protocolo, declarado con la sintaxis (@protocol en Objective-C) se utiliza para declarar un conjunto de métodos que una clase "adopta" (declara que usará este protocolo) implementará. Esto significa que puede especificar en su código que "no le importa qué clase se utiliza siempre que implemente un protocolo en particular". Esto se puede hacer en Objective-C de la siguiente manera:

id<MyProtocol> instanceOfClassThatImplementsMyProtocol;

Si usted afirma esto en su código, entonces cualquier clase que "se ajusta" al protocolo MyProtocol se puede utilizar en la variable instanceOfClassThatImplementsMyProtocol . Esto significa que el código que usa esta variable sabe que puede usar cualquiera de los métodos definidos en MyProtocol con esta variable en particular, independientemente de la clase que sea. Esta es una gran manera de evitar el patrón de diseño de herencia y evita un acoplamiento estricto.

Los delegados son un uso de la función de idioma de los protocolos. El delegation design pattern es una forma de diseñar su código para usar protocolos cuando sea necesario. En los marcos de Cocoa, el patrón de diseño de delegado se utiliza para especificar una instancia de una clase que se ajusta a un protocolo particular. Este protocolo particular especifica los métodos que la clase delegada debería implementar para realizar acciones específicas en eventos determinados. La clase que usa el delegado sabe que su delegado funciona en el protocolo, por lo que sabe que puede llamar a los métodos implementados en momentos determinados. Este patrón de diseño es una excelente manera de desacoplar las clases, porque hace que sea muy fácil intercambiar una instancia de delegado por otra. Todo lo que tiene que hacer el programador es asegurarse de que la instancia o clase de reemplazo se ajuste al protocolo necesario (es decir, implementa el métodos especificados en el protocolo)!

Los protocolos y delegados no están restringidos solo al desarrollo de Objective-C y Mac/iOS, sino que el lenguaje Objective-C y los marcos de Apple hacen un uso intensivo de esta impresionante característica de lenguaje y patrón de diseño.

Editar:

He aquí un ejemplo. En el marco de UIKit de Cocoa Touch, existe un protocolo UITextFieldDelegate. Este protocolo define una serie de métodos que las clases que son delegados de una instancia de UITextField deben implementar. En otras palabras, si desea asignar un delegado a un UITextField (usando la propiedad delegate), es mejor que se asegure de que esta clase cumpla con UITextFieldDelegate. De hecho, ya que la propiedad delegado de UITextField se define como:

@property(nonatomic, weak) id<UITextFieldDelegate> delegate

A continuación, el compilador dará advertencias si asigna una clase a ella que no implementa el protocolo. Esto es realmente útil. Debe indicar que una clase implementa un protocolo, y al decir que sí lo hace, está permitiendo que otras clases sepan que pueden interactuar de una manera particular con su clase.Por lo tanto, si asigna una instancia de MyTextFieldDelegateClass a la propiedad de delegateUITextField, la UITextFieldsabe que pueda llamar a algunos métodos particulares (en relación al ingreso de texto, selección, etc.) de su MyTextFieldDelegateClass. Lo sabe porque MyTextFieldDelegateClass ha dicho que implementará el protocolo UITextFieldDelegate.

Al final, todo esto lleva a una mayor flexibilidad y adaptabilidad en el código de su proyecto, que estoy seguro de que pronto se dará cuenta después de usar esta tecnología. :)

+3

Así protocolos es lo que hace y la forma en que los delegados ¿para hacerlo? – 3lvis

+13

No estoy seguro si te sigo. La delegación es un patrón de diseño que permite que una clase asuma una responsabilidad de otra de una manera que desacopla el código (algo muy bueno y flexible). Los protocolos son una característica del lenguaje Objective-C que le permite escribir y usar un código que hace uso del concepto de delegación. –

+0

@JamesBedford me puede decir cuál es el significado de "id " – Exploring

13

Delegación: Actuando en nombre de otro objeto (patrón de diseño vaya)

Es un patrón de diseño en el que un objeto llamado el delegado actúa en nombre de, y, a petición de , otro objeto. En algún punto de la ejecución, envía un mensaje a su delegado; el mensaje le dice al delegado que algún evento está por suceder y solicita alguna respuesta. El delegado implementa el método invocado por el mensaje y devuelve un valor apropiado

Un ejemplo es el objeto appdelegate actúa en nombre de appobject.

Protocolo: Activación de la comunicación entre objetos no relacionados por herencia

Un protocolo es una declaración de una interfaz de programación cuyos métodos de cualquier clase puede implement.Protocols son objetivo c característica del lenguaje .Simply hablar una lista de métodos que cualquier clase puede implementar. Para usar esto, debe confirmar el protocolo. El ejemplo es el protocolo UITableviewDatasource, cuyos métodos cellforRowAtIndexPath se declaran en el protocolo, pero lo implementamos para crear la tabla vista.

Consulte https://developer.apple.com/library/mac/referencelibrary/GettingStarted/RoadMapOSX/books/StreamlineYourAppswithDesignPatterns/StreamlineYourApps/StreamlineYourApps.html

12

protocolo es un conjunto de métodos (ya sea opcionales o requeridos) aquellos sería ejecutado por la clase que se ajusta a ese protocolo. Mientras que, delegate es la referencia a esa clase que se ajusta a ese protocolo y se adherirá a implementar métodos definidos en el protocolo.

Eche un vistazo a this para más detalles.

+1

mejor explicación que jamás he visto, gracias. –

+0

Por favor, vota la respuesta en ese caso ... – NSPratik

+1

no te preocupes, lo hice. –

4

Vamos a ver la declaración del delegado en el programa

id<myProtocol> *delegatingObject; 

El delegatingObject mantiene una referencia a otro objeto y en el momento apropiado envía un mensaje a ese objeto.

Un protocolo es un grupo de propiedades y métodos relacionados que puede implementar cualquier clase.

implica que cualquier objeto (tipo de id) que confirma myProtocol (grupo de propiedades y métodos relacionados) puede funcionar como un delegado o puede decir que cualquier persona (id) que tenga un grado requerido (protocolo) puede funcionar como Profesor (Delegado).

4

Un i mportant p rerequisite es la comprensión de protocolos f RIMEROS entonces delegados. Te recomiendo que primero veas this breve tutorial, luego mira What is a Protocol?. Además, DEBE saber la diferencia entre clase y protocolo, así que vea Objective-C: Class versus Protocol y What is the point of Protocols?.


protocol: es más que un plan de funciones para implementar. Cualquier clase que adopte ese plan tendrá que implementar esas funciones. (No se debe confundir implementar una función con pidiendo una función)

delegate: es para que usted también lo hace qué delegar en ing clase está haciendo sin herencia p.ej

Por ejemplo, tiene un controlador de vista y desea descargar imágenes o desea obtener la distancia del cliente a una tienda, por lo que en lugar de hacerlo solo, solo tiene un objeto mediano que lo hace por usted. Ese objeto se conoce como el objeto delegado. Normalmente deberías hacer algo como tal:

class ViewController : UIViewController , DownloaderDelegate{ 
//other code 

(inside viewDidLoad or elsewhere) you write: 
downloaderHandler.delegate = self // now self can also do WHATEVER the delegate can do...previously it was only a viewController but now it's 'almost' also a downloader 

muy similar a lo que hacen por ajuste a un tableViewDelegate

class ViewController : UIViewController , UITableViewDelegate{ 
//other code 
(inside viewDidLoad or elsewhere) you write 
tableView.delegate = self 

su self cosas ahora también puede hacer tableView relacionados.


delegate: Pero ese objeto (el delegado) es un objeto con sabor de vainilla (id o cualquier otro). ¡Es tonto! Tienes que decirlo: "Oye, para que trabajes para tener funcionalidades específicas, necesitas cumplir con el protocolo que definimos para ti. (No vamos a extender Any o id porque eso sería estúpido, (en cambio) lo hicimos un protocolo muy explícita confinado "
en Objective-C es un puro de vainilla id, por lo que

@property (weak) id<DownloaderProtocol>delegate; 

en Swift * es un poco más fácil que hace:

weak var delegate:DownloaderProtocol? 

Protocolo trata de rescatar ... el de legate implementa (no usa) la función para adaptarse a las necesidades de su clase delegante.


*: En Swift no tiene id todavía no es necesario que es equivalente Any porque en protocolos Swift también son un tipo de ciudadano de primera clase

Cuestiones relacionadas