美文网首页
Swift里的值类型与引用类型 ◉•⦿

Swift里的值类型与引用类型 ◉•⦿

作者: 飞行的猫 | 来源:发表于2017-05-12 15:54 被阅读0次

◉ Swift里面的类型分为两种:

值类型(Value Types):每个实例都保留了一分独有的数据拷贝,一般以结构体(struct)、枚举(enum)或者元组(tuple)的形式出现。

引用类型(Reference Type):每个实例共享同一份数据来源,一般以类(class)的形式出现。

 ⦿ 值类型与引用类型的区别

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

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

structS{vardata:Int= -1}

var  a =S()  

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

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

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

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

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

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

classC{vardata:Int= -1}

var   x =C()

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

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

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

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

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

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

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

⦿  如何选择类型?

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

•  什么时候该用值类型(struct ,enum, tuple)

      ❖  要用==运算符来比较实例的数据时

      ❖  你希望那个实例的拷贝能保持独立的状态时

      ❖  数据会被多个线程使用时

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

      ❖  要用==运算符来比较实例身份的时候

      ❖  你希望有创建一个共享的、可变对象的时候

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

相关文章

  • Note 3 Swift (1)

    Swift学习笔记 变量与常量 变量 常量 值类型与引用类型 值类型 引用类型 数组与字典 数组 字典

  • Swift值类型&引用类型

    Swift值类型&引用类型 前言 值类型和引用类型是Swift中两种数据存储方式,简单来说值类型就是直接存储的值,...

  • 【极客班】Swift高级编程一

    Swift语言简介 值类型与引用类型 类型成员: 类与结构:类的实例是对象,结构的实例是值;类的存储是引用类型,堆...

  • swift的值类型和引用类型

    swift的类型有哪些?   swift的类型分为值类型和引用类型两种。值类型在传递和赋值时将进行复制,而引用类型...

  • Swift里的值类型与引用类型 ◉•⦿

    ◉ Swift里面的类型分为两种: 值类型(Value Types):每个实例都保留了一分独有的数据拷贝,一般以结...

  • Swift 里的值类型与引用类型

    Swift 里面的类型分为两种: 值类型(Value Types):每个实例都保留了一分独有的数据拷贝,一般以结构...

  • Swift使用(一)数据类型,常量、变量、元组

    Swift数据类型,常量、变量、元组 数据类型 Swift分为值类型和引用类型: 1、值类型分为枚举enum 和 ...

  • swift值类型与引用类型

    提出几个疑惑的问题: 1.值类型和引用类型的区别。2.swift中如何选择类与结构体。3.为什么swift3.0将...

  • swift 值类型与引用类型

    swift类型分为值类型和引用类型,最典型的对照是结构体和类。 定义一个结构体: structPointStruc...

  • Swift 一、类与结构体(下)

    一、异变方法 1.1 值类型添加/不添加mutating关键字的区别 Swift语言中的类型有值类型与引用类型之...

网友评论

      本文标题:Swift里的值类型与引用类型 ◉•⦿

      本文链接:https://www.haomeiwen.com/subject/xunztxtx.html