奇怪的是,没有命令一次删除所有视图的子视图.但是,视图的子视图数组是内部子视图列表的不可变副本,因此循环访问它并一次删除一个子视图是合法的:
for v in myView.subviews as [UIView] { v.removeFromSuperview() }
这个内容在 编程IOS 8中,如果副本是不可变副本,为什么它可以改变?
我不认为你真的在这里询问不可变数组,因为你没有在数组本身上调用任何方法,所以它的可变性不是问题.在的永恒不变的属性subviews
阵列是怎样的观点已经决定提出的名单你.它与子视图如何与父视图交互无关.
你似乎对为什么子视图可以从父视图中删除而你不能这样做感到困惑; 这只是因为子视图是子UIView
类,父视图是UIView
子类,因此子视图可以访问父级的所有内部变量,并且可以对父级执行任何喜欢的操作.你不能.这是故意的,因为您不知道视图层次结构的复杂性(并且不希望),UIView
显然这样做.
您发布的代码的另一个有趣的方面是,通常在数组中使用数组中的元素将其从数组中删除,这将导致异常.在这种特殊情况下,subviews
您从视图接收的数组是copy
原始数组(不可变副本),因此获取子视图以从父视图中删除自身不会影响此数组,并且枚举不会动摇.感谢克里斯托弗凯文豪威尔指出这一点,因为我完全错过了它,第一次.