標籤:
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 = dicdic1[1] = "456"println(dic[1]!)
這輸出的結果是123,你敢信?這奇葩的字典居然是實值型別的
將var改成let:
let dic:Dictionary<Int,String> = [1:"123"]let dic1 = dicdic1[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 = dicdicCopy += (4→"4")println(dic)
不知道swift是出於什麼樣的考慮,將字典設計成一個實值型別,難道是出於效能考慮?
在看看swift的數組,swift數組,在新的xCode版本中有了很大的變化,原來的那數組我就不吐槽了,使用的時候
你根本沒有辦法區分他是參考型別還是實值型別,現在統一的改為實值型別,將一個數組賦值給另外一個的時候,都是拷貝,原來是在有些情況下是拷貝,有些情況不拷貝:
var a = [1,2,3]var b = avar c = aprintln(a[0])println(b[0])println(c[0])a[0] = 42println(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語言的效能。
Swift學習筆記數組與字典