Como se pode criar uma referência fraca a um campo que é um protocolo?
sobes.tech IA
Resposta da IA
Pode usar as palavras-chave weak ou unowned antes de declarar um campo de tipo protocolo.
protocol MyProtocol: AnyObject { // O protocolo deve ser limitado a classes
func doSomething()
}
class MyClass {
weak var delegate: MyProtocol? // Referência fraca ao campo de tipo MyProtocol
unowned var helper: MyProtocol // Referência não possuída ao campo de tipo MyProtocol (se tiver certeza de que o objeto sempre existe)
}
É importante notar que o protocolo deve ser limitado a classes (: AnyObject) para que seja possível usar uma referência fraca ou não possuída. Isso garante que o tipo que implementa o protocolo seja um tipo de referência, não um tipo de valor.
Para o campo de tipo protocolo, weak é aplicado quando o objeto ao qual o campo faz referência pode ser liberado antes do objeto que contém essa referência. Se o objeto referenciado for liberado, o campo torna-se automaticamente nil.
unowned é usado quando você tem certeza de que o objeto ao qual o campo faz referência sempre possui o mesmo ou um ciclo de vida mais longo do que o objeto que contém essa referência. O uso de unowned é seguro apenas se você garantir a ausência de referências cíclicas e tiver certeza de que o objeto referenciado é sempre válido. Se o objeto for liberado e você tentar acessá-lo através de uma referência unowned, ocorrerá uma falha.
Na maioria dos casos, weak é usado para delegados e outros padrões semelhantes.