iphone objective-c delegates protocols

iphone - Diferencia entre el protocolo y los delegados?



objective-c delegates (5)

¿Cuál es la diferencia entre un protocol y un delegate ?

y,

¿Cómo podemos declarar variables en una protocol class ?


El protocolo es un conjunto de métodos (ya sean opcionales o necesarios) que la clase que implementa el protocolo implementaría. 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 obtener más detalles.


Un protocolo, declarado con la sintaxis @protocol en Objective-C, se usa 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 indica esto en su código, cualquier clase que "se ajuste" al protocolo MyProtocol se puede usar 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 utilizan el idioma de los protocolos. El patrón de diseño de la delegación 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:

Aquí hay un ejemplo. En el marco UIKit de Cocoa Touch, hay un protocolo UITextFieldDelegate . Este protocolo define una serie de métodos que deberían implementar las clases que son delegadas de una instancia de UITextField . En otras palabras, si desea asignar un delegado a un UITextField (usando la propiedad de delegate ), será mejor que se asegure de que esta clase cumpla con UITextFieldDelegate . De hecho, porque la propiedad de delegado de UITextField se define como:

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

Entonces el compilador dará advertencias si le asigna una clase 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. Entonces, si asigna una instancia de MyTextFieldDelegateClass a la propiedad delegate de UITextField , el UITextField sabe que puede llamar a algunos métodos particulares (relacionados con la entrada de texto, la selección, etc.) de su MyTextFieldDelegateClass . Lo sabe porque MyTextFieldDelegateClass ha dicho que implementará el protocolo UITextFieldDelegate .

En última instancia, todo esto lleva a una flexibilidad y adaptabilidad mucho mayores en el código de su proyecto, ¡de lo cual estoy seguro que pronto se dará cuenta después de usar esta tecnología! :)


Un requisito importante es entender los protocolos antes que los delegados. Te recomiendo que primero veas this breve tutorial, luego ve ¿Qué es un protocolo? . Además, DEBES saber la diferencia entre la clase y el protocolo, así que mira Objective-C: Class versus Protocol y What is the the point of Protocols? .

protocol: SOLO es un plan de funciones para implementar. Cualquier clase que adopte ese plan tendrá que implementar esas funciones. (NO se equivoque al implementar una función llamando a una función)

delegate: 1 es para que usted también haga lo que una clase delegante está haciendo sin herencia, por ej.

Por ejemplo, tiene un viewController 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 harías algo así:

class ViewController : UIViewController , DownloaderDelegate{ //other code // inside viewDidLoad or elsewhere you write: downloaderHandler.delegate = self // now self can also use whatever the delegating object gives it...previously it was only a viewController but now it''s ''almost'' also a downloader

muy similar a lo que haces para conformarte a un tableViewDelegate

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

tu self ahora también puede hacer cosas relacionadas con tableView.

delegate: 2 Pero ese objeto (el delegado) es un objeto simple (id o cualquiera). ¡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 ya que sería estúpido, (en cambio) hicimos un protocolo confinado muy explícito "
en Objective-C es una id vainilla pura, entonces lo haces

@property (weak) id<DownloaderProtocol>delegate;

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

weak var delegate:DownloaderProtocol?

El protocolo viene a rescatar ... el delegado implementa (no usa) la función para adaptarla a las necesidades de su clase delegante.

*: En Swift aún no tienes id , no necesitas su equivalente Any porque en Swift los protocolos también son de primera clase.


Veamos la declaración de delegado en el programa

id<myProtocol> *delegatingObject;

DelegatingObject guarda una referencia al 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 trabajar como profesor (delegado) .


Delegación: actuando en nombre de otro objeto (patrón de diseño in oops)

Es un patrón de diseño en el que un objeto llamado delegado actúa en nombre de, y a petición de, otro objeto. En algún punto en ejecución, envía un mensaje a su delegado; el mensaje le dice al delegado que algún evento está a punto de suceder y pide 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: habilitar la comunicación entre objetos no relacionados por herencia

Un protocolo es una declaración de una interfaz programática cuyos métodos cualquier clase puede implementar. Los protocolos son una característica objetiva del lenguaje. Simplemente hablando, una lista de métodos que cualquier clase puede implementar. Para usar esto, debe confirmar el protocolo. 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