码迷,mamicode.com
首页 > 编程语言 > 详细

Swift学习笔记数组与字典

时间:2015-06-13 19:56:59      阅读:135      评论:0      收藏:0      [点我收藏+]

标签:

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语言的性能。

 

Swift学习笔记数组与字典

标签:

原文地址:http://www.cnblogs.com/qugangf/p/4573873.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!