关于开发到底使用ValueType 值类型还是Reference Type 引用类型,关于这个,Swift:什么时候使用结构体和类这个文章写得比较好 这里我就不再多说了 我只带大家深入了解一下。
大家都知道值类型在赋值的时候做的是值复制的过程,引用类型赋值做的是引用复制,但实例不复制。
但是有没有想过嵌套类型呢?比如以下4种(只讨论一层嵌套最后会做总结)
-
引用类型嵌套引用类型
-
值类型嵌套值类型
-
引用类型嵌套值类型
-
值类型嵌套引用类型
-
引用类型嵌套引用类型
代码如下
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
|
classInner{
var
value=99
}
classOutter{
value=99
inner=Inner()
}
out1=Outter()
out2=out1
out1.value=100
out1.inner.value=100
print(
"outer2.value=\(out2.value)outer2.inner.value=\(out2.inner.value)"
)
|
结果为
"outer2.value=100 outer2.inner.value=100\n"
画图分析
Paste_Image.png
结论:
如果你有一个引用类型嵌套了另外一个引用类型,没有什么特别的事会发生。像通常那样,任何一个指向内部或者外部值的指针都能操纵他指向的对象。只要其中一个引用操纵值使其改变,其他引用指向的值也就跟着变了。
8
structInner{
value=99
}
structOutter{
inner=Inner()
value=99
}
|
情况1 只复制外部值
6
out1=Outter()
out2=out1
out1.value=100
out1.inner.value=100
结果:
"outer2.value=99 outer2.inner.value=99\n"
2 只复制内部值
5
out3=Outter()
innter=out3.inner
innter.value=100
out3.value
out3.inner.value
|
画图
结论
2 如果你有一个值类型嵌套了另外一个值类型,这就会有效地使值所占的内存区域变大。内部值是外部值的一部分。如果你把外部值放到一块新的存储空间里,所有的值包括内部值都会被拷贝。如果你把内部值放进一块新的存储空间中,只有内部值会被拷贝。
13
classOutter{
value=99
}
out1=Outter()
out2=out1
out1.value=100
out1.inner.value=100
结果
3 一个引用类型嵌套了一个值类型会有效扩大这个引用类型所占内存区域。任何指向外部值的指针都可以操纵一切,包括嵌套的内部值。内部值的任何改变对于引用外部值的指针来说都是可见的。如果你把内部值放进一块新的存储区,就会在那块存储区拷贝一份新的值。
以上是三种常见情况
下面是最重要的
下面是最重要的
"outer2.value=99 outer2.inner.value=100\n"
一个值类型嵌套一个引用类型就没有那么简单了。你可以有效地打破值语义而不被察觉。这可能是好的也可能是坏的,取决于你怎么做。当你把一个引用类型嵌套进一个值类型中,外部值被放进一块新的内存区域时就会被拷贝,但是拷贝的对象仍然指向原始的那个嵌套对象。
对上面的举例
尽管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 是这样做的
再来
ottom:auto!important; float:none!important; height:auto!important; left:auto!important; line-height:1.1em!important; margin:0px!important; outline:0px!important; overflow:visible!important; padding:0px!important; position:static!important; right:auto!important; top:auto!important; vertical-align:baseline!important; font-family:Consolas,copy)NSDictionary*dataDic;
-(void)setDataDic:(NSDictionary*)dataDic{
_dataDic=[dataDiccopy];
很多人没这样用过 但是对NSDictionary也copy 是为什么 也是为了 自己存的数据不能被别人修改 那么Swift Dictionary 也是这样设计的
对于Array也是这样设计的
如果你真的需要Reference Type 的Swift 在Foundation的库里面也有对应的实现 Nsstring NSDictionary NSArray
最后建议 多多用ValueType 编程吧
文中的源代码和keynote 已上传到Github
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。
相关推荐
效率成吨提升之代码生成器-蓝湖工具神器iOS,Android,Swift,Flutter
软件简介:蓝湖辅助工具,减少移动端开发中控件属性的复制和粘贴.待开发的功能:1.支持自动生成约束2.开发设置页面3.做一个浏览器插件,支持不需要下载整个工程,可即时操作当前蓝湖浏览页面4.支持Flutter语言模板生成5.支持更多平台,如Sketch等6.支持用户自定义语言模板
【Audio音频开发】音频基础知识及PCM技术详解
现实生活中,我们听到的声音都是时间连续的,我们称为这种信号叫模拟信号。模拟信号需要进行数字化以后才能在计算机中使用。目前我们在计算机上进行音频播放都需要依赖于音频文件。那么音频文件如何生成的呢?音频文件的生成过程是将声音信息采样、量化和编码产生的数字信号的过程,我们人耳所能听到的声音频率范围为(20Hz~20KHz),因此音频文件格式的最大带宽是20KHZ。根据奈奎斯特的理论,音频文件的采样率一般在40~50KHZ之间。奈奎斯特采样定律,又称香农采样定律。...............
见过仙女蹦迪吗?一起用python做个小仙女代码蹦迪视频
前言最近在B站上看到一个漂亮的仙女姐姐跳舞视频,循环看了亿遍又亿遍,久久不能离开!看着小仙紫姐姐的蹦迪视频,除了一键三连还能做什么?突发奇想,能不能把舞蹈视频转成代码舞呢?说干就干,今天就手把手教大家如何把跳舞视频转成代码舞,跟着仙女姐姐一起蹦起来~视频来源:【紫颜】见过仙女蹦迪吗 【千盏】一、核心功能设计总体来说,我们需要分为以下几步完成:从B站上把小姐姐的视频下载下来对视频进行截取GIF,把截取的GIF通过ASCII Animator进行ASCII字符转换把转换的字符gif根据每
自定义ava数据集及训练与测试 完整版 时空动作/行为 视频数据集制作 yolov5, deep sort, VIA MMAction, SlowFast
前言这一篇博客应该是我花时间最多的一次了,从2022年1月底至2022年4月底。我已经将这篇博客的内容写为论文,上传至arxiv:https://arxiv.org/pdf/2204.10160.pdf欢迎大家指出我论文中的问题,特别是语法与用词问题在github上,我也上传了完整的项目:https://github.com/Whiffe/Custom-ava-dataset_Custom-Spatio-Temporally-Action-Video-Dataset关于自定义ava数据集,也是后台
【视频+源码】登录鉴权的三种方式:token、jwt、session实战分享
因为我既对接过session、cookie,也对接过JWT,今年因为工作需要也对接了gtoken的2个版本,对这方面的理解还算深入。尤其是看到官方文档评论区又小伙伴表示看不懂,所以做了这期视频内容出来:视频在这里:本期内容对应B站的开源视频因为涉及的知识点比较多,视频内容比较长。如果你觉得看视频浪费时间,可以直接阅读源码:goframe v2版本集成gtokengoframe v1版本集成gtokengoframe v2版本集成jwtgoframe v2版本session登录官方调用示例文档jwt和sess
【Android App】实战项目之仿微信的私信和群聊App附源码和演示视频 超详细必看
【Android App】实战项目之仿微信的私信和群聊App(附源码和演示视频 超详细必看)
采用MATLAB对正弦信号,语音信号进行生成、采样和恢复,利用MATLAB工具箱对混杂噪声的音频信号进行滤波
采用MATLAB对正弦信号,语音信号进行生成、采样和内插恢复,利用MATLAB工具箱对混杂噪声的音频信号进行滤波
Keras深度学习实战40——音频生成
随着移动互联网、云端存储等技术的快速发展,包含丰富信息的音频数据呈现几何级速率增长。这些海量数据在为人工分析带来困难的同时,也为音频认知、创新学习研究提供了数据基础。在本节中,我们通过构建生成模型来生成音频序列文件,从而进一步加深对序列数据处理问题的了解。
- • 效率成吨提升之代码生成器-蓝湖工具神器…
- • 【Audio音频开发】音频基础知识及PCM技…
- • 见过仙女蹦迪吗?一起用python做个小仙…
- • 【Android App】实战项目之仿抖音的短视…
- • 自定义ava数据集及训练与测试 完整版 时…
- • 【视频+源码】登录鉴权的三种方式:tok…
- • 【Android App】实战项目之仿微信的私信…
- • 零基础用Android Studio实现简单的本地…
- • 采用MATLAB对正弦信号,语音信号进行生…
- • Keras深度学习实战40——音频生成
- • 视频实时行为检测——基于yolov5+deeps…
- • 数电实验 数字电子钟设计 基于quartus …
- • 腾讯会议使用OBS虚拟摄像头
- • 文本生成视频Make-A-Video,根据一句话…
- • 信号处理——MATLAB音频信号加噪、滤波
- • 【新知实验室 - TRTC 实践】音视频互动…
- • Keras深度学习实战39——音乐音频分类
- • C++游戏game | 井字棋游戏坤坤版配资源…
|
|