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