Я понимаю использование и поверхностные различия между weak
и unowned
в Swift:
Самый простой пример, который я видел, это то, что если есть Dog
и Bone
, Bone
может иметь слабую ссылку на Dog
(и наоборот), потому что каждый может существовать независимо друг от друга.
С другой стороны, в случае Human
и Heart
, Heart
может иметь ссылку unowned
на человека, потому что, как только Human
становится... "разыменованным", Heart
становится недоступным. Это и классический пример с Customer
и CreditCard
.
Так что это не дубликат вопросов об этом.
У меня вопрос, какой смысл иметь два таких похожих понятия? Каковы внутренние различия, которые требуют наличия двух ключевых слов для того, что кажется на 99% одним и тем же? Вопрос в том, ПОЧЕМУ существуют различия, а не в чем они заключаются.
Учитывая, что мы можем просто установить такую переменную: weak var customer: Customer!
, преимущество необязательных переменных unowned
является спорным вопросом.
Единственное практическое преимущество, которое я вижу в использовании
unowned
по сравнению с неявным развертыванием переменнойweak
через!
, заключается в том, что мы можем сделатьunowned
ссылок постоянными черезlet
.
... и, возможно, по этой причине компилятор может сделать более эффективную оптимизацию.
Так ли это, или за кулисами происходит что-то еще, что дает убедительный аргумент в пользу сохранения обоих ключевых слов (даже несмотря на то, что небольшое различие, основанное на трафике переполнения стека, очевидно, сбивает с толку как новых, так и опытных разработчиков).
Мне было бы очень интересно услышать от людей, которые работали над компилятором Swift (или другими компиляторами).