首页 > 代码库 > swift 学习笔记:值类型and参考类型!

swift 学习笔记:值类型and参考类型!

helloworld篇章

 

值:

swift中类型分为两种:第一种是值类型,该类型的每个实例持有数据的副本,并且该副本对于每个实例来说是独一无二的一份,比如结构体(struct)、枚举(enum)、元组(tuple)都是值类型。第二种是参照类型,该类型的实例共享数据唯一的一份副本(在native层面说的话,就是该类型的每个实例都指向内存中的同一个地址),比如类(class)就是参照类型

 

如果你想创建一个新类型,那么你应该选择值类型还是参照类型呢?当你使用Cocoa框架时,很多API都是NSObject的子类,那么你就必须要使用参照类型,也就是class。在其他情况下,这里有一些指导建议你可以参考:

使用值类型的情形:

  • 使用==运算符比较实例数据的时候。
  • 你想单独复制一份实例数据的时候。
  • 当在多线程环境下操作数据的时候。

使用参照类型(比如class)的情形:

  • 当使用===运算符判断两个对象是否引用同一个对象实例的时候。
  • 当上下文需要创建一个共享的、可变的对象时。

在Swift中,ArrayStringDictionary都是值类型。它们的使用方式类似C语言中得int,每一个实例都有一份数据。你不需要进行显示的复制操作去防止数据在你不知情的情况下被修改。更重要的是,你可以跨线程进行传参而不需要考虑同步的问题,因为传递值类型很安全。秉着高安全性的精神,这种类型划分模式能帮助你在Swift中写出更加有可预测性的代码。

 

测试代码如下:

//值类型测试struct a {    var item:Int = 10}var x = a()var y = xy.item = 20x//数组值类型var intArray:[Int] = [1,2,3]var bArray = intArraybArray[2] = 4bArrayintArray//字符串值类型var aString:NSString = "123456"var bString = aStringbString = "aswdef"aString//字典值类型var aDic:Dictionary<String,String>=["三国演义":"罗贯中","水浒传":"施耐庵"];var bDic = aDicbDic["a"] = "b"bDicaDicaDic.removeValueForKey("水浒传")aDicbDic//参考类型class aClass {    var item:Int = 7}var aa = aClass()var bb = aabb.item = 10aa

 playground输出值如下:

swift 学习笔记:值类型and参考类型!