sociales sobre redes psicologia los libros libro las internet estudios cuestionario adolescentes adicción adiccion abuso swift variables weak-references

swift - sobre - ¿Por qué la palabra clave "débil" solo se puede aplicar a los tipos de protocolo de clase y de clase



estudios sobre la adiccion a las redes sociales (9)

Cuando declaro variables como weak en Swift, a veces recibo el mensaje de error de Xcode:

''débil'' solo se puede aplicar a los tipos de protocolo de clase y de clase

Me preguntaba por qué la palabra clave weak solo puede aplicarse a los tipos de protocolo de clase y de clase. ¿Cuál es la razón detrás de esto?


Bueno, en caso de que alguien más piense que tiene todo correcto en su código como yo, verifique que no haya reemplazado erróneamente : por an = .

Aquí está lo que tenía. También me estaba dando el mismo error que el anterior:

protocol PenguinDelegate: class { func userDidTapThePenguin() } class MyViewController: UIViewController { weak var delegate = PenguinDelegate? }

Pero la forma correcta es:

protocol PenguinDelegate: class { func userDidTapThePenguin() } class MyViewController: UIViewController { weak var delegate: PenguinDelegate? }

¿Ves la diferencia? Me tomó un tiempo ver que tenía un signo igual en lugar de dos puntos. También tenga en cuenta que obtuve otros errores para la misma línea porque había decidido que mi primer error parecía ser el verdadero problema:

- weak solo se puede aplicar a los tipos de protocolo de clase y de clase

: - <


Descubrí en un caso en el que incluso tienes un tipo de clase, pero aún así aparece este mensaje de error.

Por ejemplo,

class MyVC: UIViewController { var myText: UITextView = { [weak self] let text = UITextView() // some codes using self return text }() }

Aquí se UITextView un objeto UITextView de un bloque anónimo como inicialización de var myText . Recibí el mismo tipo de mensaje de error. Para resolver el problema, la var debe marcarse como lazy :

class MyVC: UIViewController { lasy var myText: UITextView = { [weak self] let text = UITextView() // some codes using self return text }() }



Traté de capturar las propiedades de tipo String y Array para un cierre. Tengo estos errores:

''débil'' solo se puede aplicar a los tipos de protocolo de clase y de clase, no a ''[Cadena]''

''débil'' solo puede aplicarse a los tipos de protocolo de clase y de clase, no a ''Cadena''

Jugué un rato en el patio de recreo, y resultó que capturarse a sí mismo es suficiente para estos tipos.


Una razón común para este error es que ha declarado su propio protocolo, pero olvidó heredar de NSObjectProtocol:

protocol PenguinDelegate: NSObjectProtocol { func userDidTapThePenguin() } class MyViewController: UIViewController { weak var delegate: PenguinDelegate? }

El código anterior le dará el error si olvida heredar de NSObjectProtocol . La razón es que weak solo tiene sentido para los tipos de referencia (clases). Entonces, hace que el compilador sea menos nervioso al indicar claramente que PenguinDelegate está destinado a clases y no a tipos de valor.


Estaba usando la clase objetiva C en Swift para un scrolView. Creé IBOutlet de esa vista de desplazamiento. Y al compilar código, este error comenzó a aparecer.

Entonces, para solucionar este tipo de problema, importe esa clase en su encabezado de puente

importar "YourClass.h"

Estaba usando Xcode 9.2 con Swift 3.2


weak es para ARC (conteo automático de referencia). Significa no agregar el recuento de referencias. Por lo tanto, solo funciona para Class . Y en Swift, obtendrá un valor opcional para la seguridad.


weak es un calificador para los tipos de referencia (a diferencia de los tipos de valores, como las struct y los tipos de valores integrados).

Los tipos de referencia le permiten tener múltiples referencias al mismo objeto. El objeto se desasigna cuando la última referencia fuerte deja de hacer referencia a él (las referencias débiles no cuentan).

Los tipos de valor, por otro lado, se asignan por copia. El recuento de referencias no se aplica, por lo que el modificador weak no tiene sentido con ellos.


protocol PenguinDelegate: class { func userDidTapThePenguin() } class MyViewController: UIViewController { weak var delegate: PenguinDelegate? }

Si escribe class después de su protocolo, también funciona y parece más apropiado que para NSObjectProtocol.