Sobes.tech
Middle+

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.