关于值和引用类型的快速指南

Swift中的值和引用类型定义了如何在代码中直接传递变量或通过复制数据来传递变量。 它们的用法会极大地影响您组织和编写代码的方式。

值类型

值类型是不可变的,一旦设置就无法编辑。 对变量的任何更改都会导致该值类型的新实例。 如果使用诸如var i = 10类的变量,这似乎违反直觉,因为vars是可变的,但实际上,每次更新该变量时,我们都会创建一个新的内存中实例。

值类型最基本的区别特征是复制-赋值,初始化和参数传递的效果-创建具有其数据唯一副本的独立实例 ”-Swift Blog

考虑以下代码:

  var testScore:Int = 80
 var studentA.testResults = testScore
 testScore = 90 

如果我们读出学生A的测试结果,我们期望他或她的分数为80。这是因为变量studentA.testResults设置了内存中有testScore的副本,而不是 testScore的实际实例。 将值类型分配给变量后,对其进行的任何更改均不会影响该变量。 像testScore这样的Integer使用值语义来实现此结果。

参考类型

引用类型是对象的共享实例,直接在代码中传递。 将其从一个变量复制到另一个变量时,它们都将访问相同的实例和数据。 因此,更改一个影响另一个。

 类TestResults {var score:Int?}
 var results = TestResults()var studentA.testResults = results
 var studentB.testResults = resultsstudentA.testResults.score = 95
 studentB.testResults.score = 75 

如果我们读出测验分数,则两个学生的测验分数均为75! 这是因为类是使用引用语义构建的。 学生A的测试结果引用了与学生B相同的results变量,因此当我们将分数更新为75时,两个学生均获得新成绩。

相反,如果TestResults是一个结构而不是一个类,那么值语义就在发挥作用,并且学生A的测试结果将保持在95。这是因为每次将结果保存到新变量时都将复制results

区分两者

引用类型是使用类创建的,而值类型通常是使用struct,enum,tuple甚至是原始类型(例如StringIntDouble ,…)创建的。 数组和字典也是值类型的示例。

比较两者

比较两个值类型的相等性时,通常只使用== 。 使用两种引用类型时,您可以选择。 如果要验证两个实例是同一实例,则将使用=== ,但是如果要比较两个单独的实例是否相等,则将要使用==

要使用==比较两个类,如果尚未完成,则可能需要手动实现Equatable协议。

每个人的好处

===比较时,您可以选择使用值语义。 当您要创建共享且可变的状态时,您还希望使用值语义。

当您希望数据副本独立于自身时,可以选择使用值语义。 在跨多个线程使用数据以防止竞争条件时,首选使用值语义。


您对引用和值类型还有其他想法吗? 在评论中或通过@_alecoconnor在Twitter上与我联系


如果您有40分钟的时间,我建议您在Swift WWDC视频中观看用价值类型构建更好的应用程序 。 他们在解释值和引用类型方面做得非常出色,并列举了一些很好的例子:

在Swift中使用值类型构建更好的应用程序– WWDC 2015 –视频– Apple Developer

Swift以功能强大的结构形式支持丰富的一流值类型,这为构建您的……提供了新的途径。

developer.apple.com

如需快速阅读,请查看Swift博客上的这篇文章。 当他们更新它时,博客是一个很好的资源!

值和引用类型– Swift博客

从创建它的工程师那里获取有关Swift编程语言的最新新闻和有用的提示。

developer.apple.com

打字愉快!