标签:
swift中数组和字典都是以结构体的形式实现的。
首先,这个很奇葩,我不知道为什么这样设计,这样是出于一个什么样的考虑。
在C#中使用字典:
Dictionary<int, string> dic = new Dictionary<int, string>(); Dictionary<int, string> dic1 = dic; dic.Add(1,"123"); dic1[1]="456"; Console.WriteLine(dic[1]);
在C#中,这种代码我闭着眼睛也看出来这是等于456的,可swift中:
var dic:Dictionary<Int,String> = [1:"123"] var dic1 = dic dic1[1] = "456" println(dic[1]!)
这输出的结果是123,你敢信?这奇葩的字典居然是值类型的
将var改成let:
let dic:Dictionary<Int,String> = [1:"123"] let dic1 = dic dic1[1] = "456" println(dic[1]!)
编译报错,我ca,居然是值类型的。我不知道为什么字典要使值类型的,这意味着我1个方法里面传递一个字典居然是拷贝过去的。
这样我岂不是在函数里传递字典的时候都要考虑inout关键字如下:
func setDic(inout dic:Dictionary<Int,String>){ dic[2] = "789" } var dic:Dictionary<Int,String> = [1:"123"] setDic(&dic) println(dic[2]!)
我也是醉了,不知道为什么字典要使用结构类型去设计,Scala中可变的hashMap也是使用引用类型设计的
val dic : scala.collection.mutable.HashMap[Int,String] = scala.collection.mutable.HashMap.empty[Int,String] dic += (3→"3") val dicCopy = dic dicCopy += (4→"4") println(dic)
不知道swift是出于什么样的考虑,将字典设计成一个值类型,难道是出于性能考虑?
在看看swift的数组,swift数组,在新的xCode版本中有了很大的变化,原来的那数组我就不吐槽了,使用的时候
你根本没有办法区分他是引用类型还是值类型,现在统一的改为值类型,将一个数组赋值给另外一个的时候,都是拷贝,原来是在有些情况下是拷贝,有些情况不拷贝:
var a = [1,2,3] var b = a var c = a println(a[0]) println(b[0]) println(c[0]) a[0] = 42 println(a[0]) println(b[0]) println(c[0]) a.insert(777, atIndex: 0) println(a[0]) println(b[0]) println(c[0])
现在的数组已经是改了,值类型,修改一个下标不影响另外一个。原来使用恒等号判断,现在也改成了==号
if(b[1...2] == a[2...3]){ println("true") } if(b == c ) { println("true") }
不过这样设计肯定是有设计者的考虑,而且使用llvm的编译架构与lvm的编译架构有什么区别,这些都不太清楚
对于中间代码的优化也不太清楚,也许使用值类型,性能上更加高吧,也许是性能上的考虑。
在书上说,数组拷贝接近于C语言的性能。
标签:
原文地址:http://www.cnblogs.com/qugangf/p/4573873.html