Необязательный эталон по сравнению со слабым в Swift 5.0 - PullRequest
0 голосов
/ 24 февраля 2019

Это разрешено в Swift 5.0:

class Person { 
    unowned var child: Person?
}

Это поддерживается примечаниями к выпуску :

неизвестные и неизвестные (небезопасные) переменные теперьПоддержка дополнительных типов.(47326769)

Я точно понял разницу между слабым и непризнанным в Swift 4.2 и ранее.Однако я не уверен, почему Apple решила сделать тип unowned optional.Даже в документах (которые являются документами для Swift 5.0) это реализованное «предложение» (где я могу даже найти это предложение с мотивацией для добавления необязательных ссылок без ссылки?) Не обновляется, потому что оно говорит:

Ожидается, что неизвестная ссылка всегда будет иметь значение.В результате ARC никогда не устанавливает значение неподтвержденной ссылки равным nil, что означает, что неподтвержденные ссылки определяются с использованием необязательных типов.

Выше не соответствует истине.Единственное функциональное отличие, которое заявляет Apple, заключается в том, что ссылка unowned, как ожидается, будет иметь такой же или более длинный срок службы, чем объект, содержащий эту ссылку.Что ж, меня интересует техническое использование этого.

Какая разница, когда я использую ссылку weak по сравнению с опциональной unowned?Или единственное различие заключается в том, что необязательный unowned должен использоваться, когда ссылочный объект имеет более длительный срок службы?Я ожидаю, что должно быть больше ...

1 Ответ

0 голосов
/ 24 февраля 2019

Вы неправильно поняли примечание к выпуску и значение изменения языка.

, почему Apple решила сделать необязательный необязательный тип

Они не сделали«т.Вы можете и, как правило, по-прежнему говорите

unowned let owner : MyViewController

Единственное изменение здесь заключается в том, что неизвестная переменная может быть необязательной, что ранее было недопустимым.Это изменение заботится о досадном крайнем случае, вот и все.

Выше не соответствует действительности

Да, это так.Вещи совершенно не изменились:

  • Слабые ссылки должны быть напечатаны как Необязательные;они не сохраняют указанный объект, но отслеживают указанный объект и возвращаются к nil, если этот объект исчезает.
  • Неизвестные ссылки не сохраняют упомянутый объект и не отслеживают упомянутый объект, поэтому вы должны не допустить того, чтобы этот объект исчез, или вы можете получить висящий указатель и сбой.

Единственное, что изменилось, это то, что раньше существовало дополнительное правило, согласно которому неизвестный ссылочный тип не мог быть необязательным.Это правило больше не применяется.

Как вы правильно заметили, если неподходящий тип ссылки является необязательным, это должна быть ссылка var, а не ссылка let (посколькуналичие этого параметра необязательно, если бы у вас не было возможности изменить его с nil на фактическое значение и наоборот).

Типичный вариант использования очень похож на то, что вы самипри условии:

class Node {
    unowned var parent: Node?
}

Представляется разумным сказать, что этот узел может иметь или не иметь родителя (потому что он может быть в верхней части графика), но если он делает иметь родителя, этот родитель должен быть неизвестным (родитель должен сохранить своего ребенка, но ребенок не должен сохранять своего родителя).Раньше единственный способ сказать это состоял в том, чтобы сделать это слабой ссылкой, что влечет за собой некоторые ненужные издержки и является бесполезным, потому что мы можем абсолютно гарантировать, что если у узла есть родительский элемент, родительский объект переживет дочерний элемент.Теперь вы можете сказать, что вы имеете в виду, что, как правило, хорошо.

...