protocol fileprivate extension example delegate and swift protocols

fileprivate - swift visibility



El protocolo swift ''débil'' no se puede aplicar a un tipo que no sea de clase (2)

Puede hacer que el protocolo se derive de cualquier tipo de clase como NSObject o AnyObject. p.ej :

protocol TopNewsTableDelegate : AnyObject{ func topNewsTableDidLoadedStories() }

Estoy un poco confundido. ¿Cuál es la diferencia entre el protocol A : class { ... } y el protocol A{ ... } , y cuál debemos usar en swift?

PD: recibimos un error cuando escribimos así

protocol A{ ... } weak var delegate: A

error: ''débil'' no se puede aplicar a un tipo que no sea de clase


protocol A : class { ... }

define un "protocolo solo de clase " : solo los tipos de clase (y no las estructuras o enumeraciones) pueden adoptar este protocolo.

Las referencias débiles solo se definen para los tipos de referencia . Las clases son tipos de referencia, las estructuras y las enumeraciones son tipos de valor. (Los cierres también son tipos de referencia, pero los cierres no pueden adoptar un protocolo, por lo que son irrelevantes en este contexto).

Por lo tanto, si el objeto que cumple con el protocolo debe almacenarse en una propiedad débil, entonces el protocolo debe ser un protocolo de clase solamente.

Aquí hay otro ejemplo que requiere un protocolo de clase solamente:

protocol A { var name : String { get set } } func foo(a : A) { a.name = "bar" // error: cannot assign to property: ''a'' is a ''let'' constant }

Esto no se compila porque para instancias de estructuras y enumeraciones, a.name = "bar" es una mutación de a . Si define el protocolo como

protocol A : class { var name : String { get set } }

entonces el compilador sabe que a es una instancia de un tipo de clase y a es una referencia al almacenamiento de objetos, y a.name = "bar" modifica el objeto al que se hace referencia, pero no a .

Entonces, en general, definiría un protocolo solo de clase si necesita que los tipos que adoptan el protocolo sean tipos de referencia y no tipos de valor.