简单的澄清对象 Swift 语言
Posted
技术标签:
【中文标题】简单的澄清对象 Swift 语言【英文标题】:Simple Clarification Objects Swift Language 【发布时间】:2014-12-06 19:51:08 【问题描述】:我有一个非常简单的问题,我可能误解了。
我有两个 UIView“A”和“B”。如果我写:
let A = UIView() // Or something else
let B = A
然后我改变B的属性(例如框架),A的属性也会改变吗?
虽然没有,但我正在为视图设置动画,所以我有初始视图和最终视图。我创建了一个这样的过渡视图:
let transitionView = finalView
然后我更改了transitionView的属性,例如标签的位置。
当我在动画末尾添加最终视图时,标签位于新位置。
为什么?谢谢
【问题讨论】:
这是 Swift 的一个非常基本的特性。在对此类问题使用带宽之前,请尝试查阅文档。 这个问题似乎是题外话,因为它甚至没有尝试查阅文档。 【参考方案1】:在 swift 中,类型分为两大类:
引用类型 值类型类是引用类型;结构体(包括数组和字典)、基本数据类型(int、float、string 等)和枚举都是值类型。
值类型总是按值传递,这意味着当分配给变量或传递给函数/方法时,会创建原始数据的副本。此规则有一个例外:函数/方法可以在值类型参数上使用 inout
修饰符以使其通过引用传递。
请注意,编译器和运行时通常会进行优化,因此除非严格需要,否则并不总是创建副本 - 重要的是,作为开发人员,我们知道我们正在处理副本而不是原始数据。
引用类型始终通过引用传递,这意味着在将其分配给变量或将其传递给函数/方法时,分配/传递的是对数据的引用,而不是数据本身。
UIView
是一个类,因此当您创建一个实例时,将其分配给一个变量,然后将该变量分配给另一个变量,分配的是对实例的引用而不是实例本身。两个变量都指向同一个UIView
实例。对实例所做的任何更改对引用该实例的所有变量都是可见的。
推荐阅读:Classes and Structures
【讨论】:
好的,谢谢,我意识到我不明白这一切......那么我该如何复制视图呢?如何在不修改第一个视图的情况下修改第二个视图? 只需创建另一个实例 - 而不是let b = a
、let b = UIView()
。如果你真的想要一份a
的副本,只需在谷歌上搜索create copy UIView
- 也许this answer 可以完成这项工作,但从未尝试过。
@Coconuts 如果您对这个问题的答案的理解产生了新问题,请提出一个新问题!另外,如果您的回答对您有所帮助,请考虑接受(复选标记)。
@Antonio 这不准确。我们刚刚在***.com/questions/27364117/… 讨论过这个问题,说引用类型是通过引用传递的是错误的。它们是按值传递的,但值是引用的值(想想指针)。说值类型总是按值传递也是错误的,因为如果您愿意,可以通过引用传递它(使用inout
)。很容易将“引用类型”与“按引用传递”混淆,我自己也混淆了它们 - 但不要。
@matt 关于这个主题有很多话要说。从开发人员的角度来看,我需要知道的是,当我将类实例传递给函数时,我传递的是对实例的引用而不是实例副本 - 当我传递值类型时,我传递的是它的副本(无论编译器或运行时为防止实际副本所做的优化)。因此,如果我说“引用类型通过引用传递”而不是更详尽地解释如何完成,我认为会更直观。我认为在解释单纯的概念时,提供太多细节可能会更加混乱。【参考方案2】:
因为B和A是不是两个视图。它们是对同一个 UIView 对象的引用。
这又是因为类实例在 Swift 中作为引用类型传递。
现在在这里查看我关于这个主题的小文章:https://***.com/a/27366050/341994
【讨论】:
我应该在文档中搜索什么?不要批评,你能告诉我一些我可以搜索的词吗? 这是一个类的实例。阅读关于 classes 的 Swift 文档页面。 developer.apple.com/library/ios/documentation/Swift/Conceptual/… 在这件事上,特别关注它用大写字母写的地方:类是引用类型。 @Coconuts 欢迎来到 Stack Overflow!如果你不那么个人化,你会更喜欢待在这里。这个答案没有批评。这只是对您提出的问题的回答! 我指的是您对我的问题的评论。感谢您的帮助 我的 cmets 也不是批评。它们是关于如何编程、如何自己解决问题以及如何提出一个好的 Stack Overflow 问题的合理建议。以上是关于简单的澄清对象 Swift 语言的主要内容,如果未能解决你的问题,请参考以下文章