Почему проходит компиляцию код, где unowned-property является optional?
Если unowned свойства в Swift не могут содержать nil, почему проходит компиляцию код, где unowned-property является optional? В чем смысл?
Ответы (2 шт):
unowned могут содержать nil, быть optional. Если Вы передадите изначально в переменную class2 nil и попытаетесь с ней работать - ничего страшного не произойдет. Но если изначально передать какой не nil объект, работать с ним, а затем он станет nil и продолжить его использовать - вот тогда получите краш.
unowned не запрещает быть optional - это механизм, чтобы "разорвать" retain cycle, гарантирующий что объект на который он указывает (но не держит сильной ссылкой) существует, иначе получим краш.
Такой пример пришел в голову, Ваш класс1 - вышка для прыжков с нее в unowned бассейн с водой. Бассейн существует - прыжки проходят нормально, все налажено. Но затем этот бассейн цементируют и делают из него площадку под застройку, теперь он nil. А вышка для прыжков в бассейн. Очередной прыжок с вышки и... crash программы.
Т.е Ваша забота использовать unowned когда уверены, что время жизни этого class2 извне больше, чем class1 в который Вы его передали.
В Swift, unowned свойства обычно используются для предотвращения сильных ссылочных циклов без необходимости делать свойство опциональным. Однако, есть случаи, когда unowned свойство может быть объявлено как опциональное, хотя это и не очень типично.
Смысл объявления unowned свойства как опционального заключается в ситуациях, когда вы хотите утверждать, что объект всегда будет существовать во время использования свойства, но в какой-то момент может стать nil. Основная идея заключается в том, чтобы использовать unowned для предотвращения сильной ссылки, однако с возможностью иметь nil значение в некоторых специфических случаях. При этом, если вы обращаетесь к unowned optional свойству, когда оно содержит nil, это приведет к runtime crash, так как unowned предполагает, что объект существует.
Пример кода, который может скомпилироваться с unowned optional:

В этом примере, Car имеет unowned свойство owner, которое может быть nil, если Person был деинициализирован. Такой подход может быть использован в очень специфических ситуациях, когда управление временем жизни объектов строго контролируется и понятно.
В общем случае, если вы рассматриваете использование unowned, но предполагаете, что свойство может быть nil, возможно, более безопасным будет использование weak. Weak свойства автоматически становятся nil, когда объект, на который они ссылаются, освобождается, и они всегда объявляются как опциональные.
