我对一些我可能误解的问题有一个非常简单的问题。
我有两个UIViews" A"和" B"。如果我写:
let A = UIView() // Or something else
let B = A
然后我改变B的属性(例如框架),A的属性也会改变吗?
我虽然没有,但我正在制作一个视图,所以我有了初始视图和最终视图。我创建了一个这样的过渡视图:
let transitionView = finalView
然后我更改了transitionView的属性,例如标签的位置。
当我在动画结尾添加最终视图时,标签位于新位置。
为什么?感谢
答案 0 :(得分:2)
因为B和A 不两个视图。它们是对同一个UIView对象的引用。
反过来,这是因为类实例在Swift中作为引用类型传递。
现在请点击此处查看关于此主题的小文章:https://stackoverflow.com/a/27366050/341994
答案 1 :(得分:2)
在swift类型中分为两大类:
类是引用类型;结构(包括数组和字典),基本数据类型(int,float,string等)和枚举都是值类型。
值类型始终按值传递,这意味着在分配给变量或传递给函数/方法时,会创建原始数据的副本。这个规则有一个例外:函数/方法可以在值类型参数上使用inout
修饰符来通过引用传递它。
请注意,编译器和运行时通常会进行优化,因此除非严格需要,否则不会始终创建副本 - 重要的是我们作为开发人员知道我们正在处理副本而不是原始数据。 / p>
引用类型始终通过引用传递,这意味着在将其分配给变量或将其传递给函数/方法时,将分配/传递对数据的引用而不是数据本身。
UIView
是一个类,因此在创建实例时,将其分配给变量,然后将该变量分配给另一个变量,对实例的引用而不是实例本身的引用。两个变量都指向相同的UIView
实例。对引用该实例的所有变量都可以看到对该实例所做的任何更改。