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 = x
y.item = 20
x
//数组值类型
var intArray:[Int] = [1,2,3]
var bArray = intArray
bArray[2] = 4
bArray
intArray
//字符串值类型
var aString:NSString = "123456"
var bString = aString
bString = "aswdef"
aString
//字典值类型
var aDic:Dictionary<String,String>=["三国演义":"罗贯中","水浒传":"施耐庵"];
var bDic = aDic
bDic["a"] = "b"
bDic
aDic
aDic.removeValueForKey("水浒传")
aDic
bDic

//参考类型
class aClass {
    var item:Int = 7
}
var aa = aClass()
var bb = aa
bb.item = 10
aa

 playground输出值如下:

郑重声明:本站内容如果来自互联网及其他传播媒体,其版权均属原媒体及文章作者所有。转载目的在于传递更多信息及用于网络分享,并不代表本站赞同其观点和对其真实性负责,也不构成任何其他建议。