"outer2.value=99 outer2.inner.value=100n"
一个值类型嵌套一个引用类型就没有那么简单了。你可以有效地打破值语义而不被察觉。这可能是好的也可能是坏的,取决于你怎么做。当你把一个引用类型嵌套进一个值类型中,外部值被放进一块新的内存区域时就会被拷贝,但是拷贝的对象仍然指向原始的那个嵌套对象。
对上面的举例
尽管outer2获取了value的一份拷贝,它只拷贝了inner的引用,因此两个结构体就共用了同一个inner对象。这样一来当改变outer.inner.value的值也会影响outer2.inner.value的值。哎呀!
这个行为会很有用。当你小心使用,你创建的结构体就具有写时拷贝功能(只有当你执行outer2.value = 43时才会真正的产生一个副本,否则outer2与outer仍指向共同的资源),这种高效的值语义的实现不会使数据拷贝得到处都是。Swift 中的集合就是这么做的,你也可以自己创建一个这样的类型。想要了解更多请看Let’s Build Swift.Array.
无论在什么时候你移动一个值类型他都会被拷贝,而引用类型则是产生了对同样的底层对象的一个新的引用。那也就意味着引用类型的改变对所有其他的引用都是可见的,而改变值类型只影响你改变的那块内存区域。当选择使用哪种类型时,考虑你的类型是否适合被拷贝,当类型从本质上来说是可拷贝时倾向使用值类型。最后,记住如果你在值类型中嵌入引用类型,不小心的话就会出错!
~~ByeBye
等等 你给我讲了这么多 貌似没什么用啊
错 用出躲到你都遗忘了
在我们Swift 的世界中 String Array Dictionary 都是ValueType,那么在他们装了一个AnyObject 的是不是一个Value Type Contain a ReferenceType
下面我们拿Array 距离 Array 可以看做一个特殊的Dictionary 表现形式其实是一样的。
例子
14
classPerson{
}
letp1=Person()
letp2=Person()
letp3=Person()
letp4=Person()
letp5=Person()
array1:Array=[p1,p2,p3,p4,p5]
array2=array1
array2.removeLast()
array2.first!.value=100
print(array1.first!.value)
|
虽然数组是值类型 在复制的时候会重新生成一个结构体的实例
但是数组内部指向的元素还是同一个
到这里很多人或许还觉得讲的没用
那我们拿OC举例子
1
@property(nonatomic,copy)NSString*verifyCode;
|
很多人都会这么写 但是不知道为什么 原因就是我们要保证对象的不变性 防止别人修改我自己的东西 那如果NSString 是ValueType 不就解决了 Swift中的String 是这样做的
再来
-(void)setDataDic:(NSDictionary*)dataDic{
_dataDic=[dataDiccopy];
很多人没这样用过 但是对NSDictionary也copy 是为什么 也是为了 自己存的数据不能被别人修改 那么Swift Dictionary 也是这样设计的
对于Array也是这样设计的
如果你真的需要Reference Type 的Swift 在Foundation的库里面也有对应的实现 NSString NSDictionary NSArray
最后建议 多多用ValueType 编程吧
文中的源代码和keynote 已上传到Github
(编辑:李大同)
【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!