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
}()
}
Solo para tu información y quién no está actualizado. Después de que se implementara la propuesta rápida SE-0156 https://github.com/apple/swift-evolution/blob/master/proposals/0156-subclass-existentials.md , se encuentra en la sección "Protocolos de clase única" de Swift docs. https://docs.swift.org/swift-book/LanguageGuide/Protocols.html ahora descrito para usar AnyObject en lugar de clase . Por lo tanto, es posible que : la clase sea obsoleta en el futuro.
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.