• linkedu视频
  • 平面设计
  • 电脑入门
  • 操作系统
  • 办公应用
  • 电脑硬件
  • 动画设计
  • 3D设计
  • 网页设计
  • CAD设计
  • 影音处理
  • 数据库
  • 程序设计
  • 认证考试
  • 信息管理
  • 信息安全
菜单
linkedu.com
  • 网页制作
  • 数据库
  • 程序设计
  • 操作系统
  • CMS教程
  • 游戏攻略
  • 脚本语言
  • 平面设计
  • 软件教程
  • 网络安全
  • 电脑知识
  • 服务器
  • 视频教程
  • JavaScript
  • ASP.NET
  • PHP
  • 正则表达式
  • AJAX
  • JSP
  • ASP
  • Flex
  • XML
  • 编程技巧
  • Android
  • swift
  • C#教程
  • vb
  • vb.net
  • C语言
  • Java
  • Delphi
  • 易语言
  • vc/mfc
  • 嵌入式开发
  • 游戏开发
  • ios
  • 编程问答
  • 汇编语言
  • 微信小程序
  • 数据结构
  • OpenGL
  • 架构设计
  • qt
  • 微信公众号
您的位置:首页 > 程序设计 >swift > Swift里的值类型与引用类型区别和使用

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

作者: 字体:[增加 减小] 来源:互联网 时间:2017-05-28

通过本文主要向大家介绍了swift报文类型,swift类型转换,swift和oc的区别,bic和swift的区别,taylor swift等相关知识,希望对您有所帮助,也希望大家支持linkedu.com www.linkedu.com

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"
</div>
值类型就好像身份证复印件一样,复印出来之后,修改原件上面的内容,复印件上的内容不会变。

另一方面,复制一个引用类型的时候,实际上是默默地创造了一个共享的实例分身,两者是共用一套数据。因此修改其中任何一个实例的数据,也会影响到另外那个。
    // 下面是一个引用类型的例子
    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"
</div>

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写出更可控的代码。

</div>
分享到:QQ空间新浪微博腾讯微博微信百度贴吧QQ好友复制网址打印

您可能想查找下面的文章:

  • Swift 数据类型
  • Swift 可选(Optionals)类型
  • Swift 类型转换
  • 详解Swift中的数据类型类型转换
  • 实例讲解Swift中引用类型的ARC自动引用计数
  • Swift编程之枚举类型详解
  • Swift编程中的一些类型转换方法详解
  • 深入解析Swift编程中枚举类型的相关使用
  • Swift内置的数字类型及基本的转换方法
  • Swift类型创建之自定义一个类型详解

相关文章

  • 2017-05-28MyBatis框架简介
  • 2017-05-28eclipse中maven插件安装教程
  • 2017-05-28JVM 体系结构详解
  • 2017-05-28swift3.0指纹解锁的实现方法
  • 2017-05-22Swift 可选链
  • 2017-05-22Swift 类型转换
  • 2017-05-22Swift 常量
  • 2017-05-28Swift和C语言混合编程教程
  • 2017-05-28Swift算法之栈和队列的实现方法示例
  • 2017-05-28Ubuntu 16.04上安装 Swift 3.0及问题解答

文章分类

  • JavaScript
  • ASP.NET
  • PHP
  • 正则表达式
  • AJAX
  • JSP
  • ASP
  • Flex
  • XML
  • 编程技巧
  • Android
  • swift
  • C#教程
  • vb
  • vb.net
  • C语言
  • Java
  • Delphi
  • 易语言
  • vc/mfc
  • 嵌入式开发
  • 游戏开发
  • ios
  • 编程问答
  • 汇编语言
  • 微信小程序
  • 数据结构
  • OpenGL
  • 架构设计
  • qt
  • 微信公众号

最近更新的内容

    • Swift 变量
    • Ubuntu 16.04上安装 Swift 3.0及问题解答
    • Swift算法实现字符串转数字的方法示例
    • swift实现自定义圆环进度提示效果
    • iOS socket网络编程实例详解
    • Swift 析构过程
    • 浅谈Timer和TimerTask与线程的关系
    • 详解Swift编程中的方法与属性的概念
    • 实例讲解Swift中引用类型的ARC自动引用计数
    • Swift 可选链

关于我们 - 联系我们 - 免责声明 - 网站地图

©2020-2025 All Rights Reserved. linkedu.com 版权所有