Я не думаю, что вы действительно спрашиваете об неизменяемых массивах здесь, так как вы не вызываете никаких методов в самом массиве, так что это изменчивость не может быть проблемой. Неизменяемым атрибутом массива subviews
является то, как представление решило представить список вам. Это не имеет никакого отношения к тому, как подчиненные представления взаимодействуют с родительскими представлениями.
Вы, кажется, смущены тем, почему subview может удалить себя из родительского представления, и вы не можете; это просто потому, что subview является UIView
-subclass, а родительский вид - UIView
-subclass, и поэтому subview имеет доступ ко всем внутренним переменным родителя и может делать все, что ему нравится родительскому. Ты не можешь. Это преднамеренно, поскольку вы не знаете тонкостей иерархии представлений (и не хотите), где, как это делает UIView
.
Еще один интересный аспект кода, который вы опубликовали, заключается в том, что часто получение элемента в массиве для удаления из массива при его перечислении вызовет исключение. В этом конкретном случае, однако, массив subviews
, который вы получаете из представления, представляет собой copy
оригинала (неизменяемая копия), и поэтому получение субвью для удаления из родительского представления не повлияет на этот массив, и перечисление не будет мешать. Спасибо Кристоферу Кевину Хауэлл за это, поскольку я пропустил его полностью, в первый раз.
Я помечаю его неправильно @ ~ @ – lolita
Этот код я читаю из книги программирования IOS 8, я не понимаю, он сказал, что подвид является неизменной копией внутреннего списка, но почему он может удалить элемент из него, когда итератор. – lolita
Я предпочитаю стандартную для в петлю в Swift: для подвида в подобозрениях { subview.removeFromSuperview() } –