Esto está permitido en Swift 5.0:
class Person { unowned var child: Person? }Esto está respaldado por estas notas de la versión :
Las variables sin propietario y sin propietario (no seguras) ahora admiten tipos opcionales. (47326769)
Entendí exactamente la diferencia entre débil y sin dueño en Swift 4.2 y antes. Sin embargo, no estoy seguro de por qué Apple decidió hacer del tipo unowned un tipo optional . Incluso en los documentos (que son documentos para Swift 5.0) esta 'propuesta' implementada (¿dónde puedo encontrar esa propuesta con la motivación para agregar referencias opcionales sin dueño?) no está actualizada, porque dice:
Se espera que una referencia sin dueño siempre tenga un valor. Como resultado, ARC nunca establece el valor de una referencia sin propietario en cero, lo que significa que las referencias sin propietario se definen utilizando tipos no opcionales.
Lo anterior ya no es cierto. La única diferencia funcional que afirma Apple es que se espera que una referencia unowned tenga una vida útil igual o más larga que el objeto que contiene esa referencia. Bueno, tengo curiosidad sobre el uso técnico de esto.
¿Qué diferencia hay cuando uso una referencia weak frente a una referencia opcional unowned ? ¿O es la única diferencia que se debe usar opcionalmente unowned cuando el objeto de referencia tiene una vida útil más larga? Me imagino que debe haber más...
Ha entendido mal la nota de la versión y el significado del cambio en el idioma.
por qué Apple decidió hacer de los sin dueño un tipo opcional
no lo hicieron Usted puede, y generalmente lo hará, todavía decir
unowned let owner : MyViewControllerEl único cambio aquí es que la variable sin dueño puede ser Opcional, lo que antes era ilegal. Este cambio se encarga de un caso extremo molesto, eso es todo.
Arriba ya no es cierto
Sí, lo es. Las cosas están completamente sin cambios desde antes:
nil si ese objeto deja de existir.Lo único que cambió es que solía haber una regla adicional de que un tipo de referencia sin propietario no podía ser Opcional. Esa regla ahora se ha ido.
Como señala correctamente, si el tipo de referencia sin propietario es Opcional, debe ser una referencia var , no una referencia let (porque tener esto como Opcional no tendría sentido si no tuviera el poder de cambiarlo de nil a un valor real y viceversa).
Un caso de uso típico es muy parecido al que usted mismo proporcionó:
class Node { unowned var parent: Node? }Parece razonable decir que este Nodo puede o no tener un padre (porque podría estar en la parte superior del gráfico), pero si tiene un padre, ese padre no debería tener dueño (un padre debería retener a su hijo, pero un niño no debe retener a su padre). Anteriormente, la única forma de decir eso era hacer de esto una referencia débil, lo que implica una sobrecarga innecesaria y es ocioso, porque podemos garantizar absolutamente que si un nodo tiene un padre, el padre sobrevivirá al hijo. Ahora, puede decir lo que quiere decir, lo que generalmente es algo bueno.