Swift2.0今年发布了,今天记录一下Swift中涉及到的Reference Type(引用类型)和Values Type(值类型).
在Swift2.0中Int ,String,Array,Dictionary,boolean都是值类型, 类是属于引用类型中的一种.
值类型在赋值给其他变量的时候会复制内容,引用类型在赋值给其他变量时引用这个类型值,就有点类似Objective-C中的指针一样.其实,我们在值类型的赋值的时候,并不是立刻产生副本,而是在有绝对必要的情况下才会产生副本, 而这一切都是有Swift后台程序自动为我们管理以达到运行的时候性能最优.
然而在开发中我们可能会遇到下列四种情况:
1. 引用类型嵌套引用类型
2. 值类型嵌套值类型
3. 引用类型嵌套值类型
4. 值类型嵌套引用类型
就一个原则:值类型有一个写时拷贝特性(复制给另外一个值后,在写修改后才进行拷贝操作) ,不管哪种引用类型在赋值给另外的值时,都只是拷贝的是引用;而值在 引用类型嵌套值类型这种情况中时,值并没有被拷贝一份值出来,其他三种情况符合一般情况
从以上的原则不难看出,我们在iOS开发中用的最多的就是引用类型嵌套值类型。因为在定义数据模型层的时候,我们要用一个类包含一些值类型的数据,所以我们必须要知道这四种嵌套类型的赋值机制,而在定义数据模型层的时候就用到的第三种方式, 这种方式就是引用类型嵌套值类型,修改引用类型的内部值的时候要真实地修改到其他值,不能只是修改到它的副本。
等等 , 我讲了这么多,貌似没有什么用啊!
错 , 只是多到你都遗忘了
在Swift的世界里面 String, Array, Dictionary都是值类型,在向Array中添加AnyObject的时候是不是 值类型中嵌套了引用类型呢! 其实你发现然而并没有什么卵用!!
那好吧! 我举一个在Objective-C中的例子你就懂了!
@property (nonatomic,copy) NSString *string;
很多iOS开发者都在这么写,但是他们并不知道copy用在这个地方是有什么用处,用在这个地方的用处是: 当其他对象A赋值给string 时要经过拷贝一份到内存中,然后用string指针指向这片内存,这样就能防止对象A被修改后感染到string对象,这样才能保证对象的不变性.
Swift中使用String类型,那就直接解决了这个问题,同理:在Swift中的Dictionary和Array类型也同样是这样设计的….. 如果你真的要Reference Type
Swift,在Foundation中同样也有对应的 NSDictionary NSArray NSString的实现