2014-12-06 55 views
-1

我有一个很容易被误解的问题。简单澄清对象Swift语言

我有两个UIViews“A”和“B”。如果我写:

let A = UIView() // Or something else 
let B = A 

,然后我改变B的性质(为例帧)中,A的变化也将属性?

我虽然没有,但我是一个视图的动画,所以我有初始视图和最终视图。我创建了这样一个过渡视图:

let transitionView = finalView 

然后我改变了transitionView的属性,一个标签的位置为例。

当我在动画结尾处添加最终视图时,标签位于新位置。

为什么?谢谢

+1

这是Swift的一个令人难以置信的基本特征。请在使用这种问题的带宽之前尝试查阅文档。 – matt 2014-12-06 19:55:02

+0

这个问题似乎是无关紧要的,因为它甚至不试图查阅文档。 – matt 2014-12-06 19:55:28

回答

2

在迅速的类型分为2个大类:

  • 引用类型
  • 值类型

类是参考类型;结构体(包括数组和字典),基本数据类型(int,float,string等)和枚举都是值类型。

值类型总是按值传递,这意味着当赋值给变量或传递给函数/方法时,会创建原始数据的副本。此规则有一个例外:函数/方法可以对值类型参数使用inout修饰符,以使其通过引用传递。

请注意,编译器和运行时通常会进行优化,因此除非严格需要才能创建副本 - 重要的是我们作为开发人员知道我们正在处理副本而不是原始数据。

引用类型总是通过引用传递,这意味着将其分配给变量或将其传递给函数/方法时,将分配/传递对数据的引用而不是数据本身。

UIView是一个类,因此当您创建一个实例时,将其分配给一个变量,然后将该变量分配给另一个变量,则分配该实例的引用而不是实例本身。两个变量都指向相同的UIView实例。对实例所做的任何更改都对引用该实例的所有变量都可见。

建议阅读:Classes and Structures

+0

好的,谢谢,我意识到我不了解所有这些......那么我怎样才能复制一个视图呢?我怎么能有第二个观点,我可以修改而不修改第一个? – Coconuts 2014-12-06 20:32:34

+0

只需创建另一个实例 - 而不是'let b = a','let b = UIView()'。如果你真的想要一个'a'的副本,只需谷歌的'创建副本UIView' - 也许[这个答案](http://stackoverflow.com/a/13756101/148357)做这项工作,但从来没有尝试过。 – Antonio 2014-12-06 20:40:09

+1

@Coconuts如果你对这个问题的答案有了一个新的问题,请提出一个新的问题!另外,如果您已获得答案的帮助,请考虑接受它(复选标记)。 – matt 2014-12-06 21:44:11

2

因为B和A都是而不是两种看法。它们是对同一个UIView对象的引用。

这又是因为类实例在Swift中作为引用类型传递。

现在不到我的小作文关于这一主题在这里:https://stackoverflow.com/a/27366050/341994

+0

我应该在文档中搜索什么?不要批评,你能告诉我几句话,我可以搜索吗? – Coconuts 2014-12-06 20:09:28

+0

这是一个_class_的实例。阅读关于_classes_的Swift文档页面。 https://developer.apple.com/library/ios/documentation/Swift/Conceptual/Swift_Programming_Language/ClassesAndStructures.html#//apple_ref/doc/uid/TP40014097-CH13-XID_145特别关注这个问题,在这个地方它用大写字母表示:**类是引用类型**。 – matt 2014-12-06 20:16:18

+0

@Coconuts欢迎来到Stack Overflow!如果你把事情少一些,你会更喜欢在这里。这个答案没有批评。这只是你问的问题的答案! – matt 2014-12-06 21:45:14