当前位置: 首页 > 编程笔记 >

Swift里的值类型与引用类型区别和使用

祖奇
2023-03-14
本文向大家介绍Swift里的值类型与引用类型区别和使用,包括了Swift里的值类型与引用类型区别和使用的使用技巧和注意事项,需要的朋友参考一下

Swift里面的类型分为两种:

●值类型(Value Types):每个实例都保留了一分独有的数据拷贝,一般以结构体 (struct)、枚举(enum) 或者元组(tuple)的形式出现。
●引用类型(Reference Type):每个实例共享同一份数据来源,一般以类(class)的形式出现。

在这篇博文里面,我们会介绍两种类型各自的优点,以及应该怎么选择使用。

值类型与引用类型的区别

值类型和引用类型最基本的分别在复制之后的结果。当一个值类型被复制的时候,相当于创造了一个完全独立的实例,这个实例保有属于自己的独有数据,数据不会受到其他实例的数据变化影响:


    // 下面是一个值类型的例子

    struct S { var data: Int = -1 }

    var a = S()

    var b = a                           // b是a的拷贝

    a.data = 42                         // 更改a的数据,b的不受影响

    println("\(a.data), \(b.data)")     // 输出结果 "42, -1"


值类型就好像身份证复印件一样,复印出来之后,修改原件上面的内容,复印件上的内容不会变。

另一方面,复制一个引用类型的时候,实际上是默默地创造了一个共享的实例分身,两者是共用一套数据。因此修改其中任何一个实例的数据,也会影响到另外那个。


    // 下面是一个引用类型的例子

    class C { var data: Int = -1 }

    var x = C()

    var y = x                           // y是x的拷贝

    x.data = 42                         // 更改x的数据,等于同时修改了y

    println("\(x.data), \(y.data)")     // 输出结果 "42, 42"

Mutation(修改)在安全中扮演的角色

值类型较引用类型来说,会让你更容易在大量代码中理清状况。如果你总是得到一个独立的拷贝出来的实例,你就可以放心它不会被你app里面的其他部分代码默默地修改。这在多线程的环境里面是尤为重要的,因为另外一个线程可能会在暗地里修改你的数据。因此可能会造成严重的程序错误,这在调试过程中非常难以排除。

由于差别主要在于修改数据的后果,那么当实例的数据只读,不存在需要更改的情况下,用哪种类型都是没有分别的。

你可能在想,有的时候我可能也需要一个完全不变的类。这样使用Cocoa NSObject对象的时候会比较容易,又可以保留值语义的好处。在今天,你可以通过只使用不可变的存储属性,和避开任何可以修改状态的API,用Swift写出一个不可变类(immutable class)。实际上,很多基本的Cocoa类,例如NSURL,都是设计成不可变类的。然而,Swift语言目前只强制struct和enum这种值类型的不可变性,对类这种引用类型则没有。(例如还不支持强制将子类的限制为不可变类)

如何选择类型?

所以当我们想要建立一个新的类型的时候,怎么决定用值类型还是引用类型呢?当你使用Cocoa框架的时候,很多API都要通过NSObject的子类使用,所以这时候必须要用到引用类型class。在其他情况下,有下面几个准则:

什么时候该用值类型:

●要用==运算符来比较实例的数据时
●你希望那个实例的拷贝能保持独立的状态时
●数据会被多个线程使用时

什么时候该用引用类型(class):

●要用==运算符来比较实例身份的时候
●你希望有创建一个共享的、可变对象的时候

在Swift里面,数组(Array)、字符串(String)、字典(Dictionary)都属于值类型。它们就像C语言里面简单的int值,是一个个独立的数据个体。你不需要花任何功夫来防范其他代码在暗地里修改它们。更重要的是,你可以在线程之间安全的传递变量,而不需要特地去同步。在Swift高安全性的精神下,这个模式会帮助你用Swift写出更可控的代码。

 类似资料:
  • 值类型或引用类型?结构体或类?什么时候你需要使用它们?这不是 C++ ,定义的类型为值类型可以当做引用类型使用。这也不是 Java ,所有类都是引用类型(除非你是语言设计者之一)。当你创建类的时候你就需要决定这个类所有实例的行为。在开始的时候就要做好这个重要的选择。你必须面对这个选择的后果因为改变之前的选择会引起一些代码的破坏。创建类型的时候只是很简单的选择 struct 和 class 关键字,

  • 本文向大家介绍C#引用类型和值类型的适用场合和区别,包括了C#引用类型和值类型的适用场合和区别的使用技巧和注意事项,需要的朋友参考一下 1.值类型 值类型包括:数值类型,结构体,bool型,用户定义的结构体,枚举,可空类型。 值类型的变量直接存储数据,分配在托管栈中。变量会在创建它们的方法返回时自动释放。 所有的值类型都是密封(seal)的,所以无法派生出新的值类型。 2.引用类型 引用类型包括:

  • 由于Solidity是一个静态类型的语言,所以编译时需明确指定变量的类型(包括本地变量或状态变量),Solidity编程语言提供了一些基本类型(elementary types)可以用来组合成复杂类型。 类型可以与不同运算符组合,支持表达式运算,你可以通过表达式的执行顺序(Order of Evaluation of Expressions)来了解执行顺序。 值类型(Value Type) 值类型

  • 本文向大家介绍C#中值类型和引用类型的区别深度分析,包括了C#中值类型和引用类型的区别深度分析的使用技巧和注意事项,需要的朋友参考一下 本文通俗易懂的分析了C#中值类型和引用类型的区别。分享给大家供大家参考。具体分析如下: 似乎“值类型和引用类型的区别”是今年面试的流行趋势,我已然是连续三次(目前总共也就三次)面试第一个问题就遇到这个了,这是多大的概率啊,100%,哈哈,我该买彩票去! 言归正传,

  • 问题内容: 我从“ Head First Java”学习“多态”,然后想到了这个概念。有人可以举例说明吗? 编译器检查引用类型的类,而不是对象类型。 那么引用类型和对象类型之间有什么区别? 问题答案: 我认为它们对“对象类型”和“引用类型”的使用不是标准化的,但这是我的解释。 考虑以下代码: 该 引用 是类型的。它引用的 对象 是类型。 因此,“引用类型”为,“对象类型”为。 造成这种混乱的原因是

  • 问题内容: C#区分了这两个。java会做相同还是不同? 问题答案: 在Java中,所有对象和枚举都是引用类型,所有原语都是值类型。就复制语义而言,两者之间的区别与C#中的区别相同,但是您不能在Java中定义新的值类型。