说三道四技术文摘-感悟人生的经典句子
说三道四 > 文档快照

Swift的初始化方法

HTML文档下载 WORD文档下载 PDF文档下载
Swift有着超级严格的初始化方法,不仅强化了designated初始化方法的地位,所有不加修饰的init方法都需要在方法中确保非Optional的实例变量被赋值初始化,而在子类中,也强制调用super版本的designated初始化。

我们在深入初始化方法之前,不妨先再想想Swift中的初始化想要达到一种怎样的目的。

其实就是安全。在Objective-C中,init方法是非常不安全的:没有人能保证init只被调用一次,也没有人保证在初始化方法调用以后,实例的各个变量都完成初始化,甚至如果在初始化里使用属性进行设置的话,还可能会造成各种问题。虽然Apple也明确说明了不应该在init中使用属性来访问,但这并不是编译器强制的,因此还是会有很多开发者犯这样的错误。

所以Swift有了超级严格的初始化方法。一方面,Swift强化了designated初始化方法的地位。Swift中不加修饰的init方法都需要在方法中保证所有非Optional的实例变量被赋值初始化,而在子类中也强制 (显式或隐式地)调用super版本的designated初始化,所以无论如何走何种路径,被初始化的对象总是可以完成完整的初始化的。

class ClassA {    let numA: Int    init(num: Int) {        numA = num    }}class ClassB: ClassA {    let numB: Int    override init(num: Int) {        numB = num + 1        super.init(num: num)    }}

在上面的示例代码中,注意在init里我们可以对let的实例常量进行赋值,这是初始化方法的重要特点。在Swift中let声明的值是不变量,无法被写入赋值,这对于构建线程安全的API十分有用。而因为Swift的init只可能被调用一次,因此在init中我们可以为不变量进行赋值,而不会引起任何线程安全的问题。

与designated初始化方法对应的是在init前加上convenience关键字的初始化方法。这类方法是Swift初始化方法中的“二等公民”,只作为补充和提供使用上的方便。所有的convenience初始化方法都必须调用同一个类中的designated初始化完成设置,另外convenience的初始化方法是不能被子类重写或从子类中以super的方式被调用的。

class ClassA {    let numA: Int    init(num: Int) {        numA = num    }    convenience init(bigNum: Bool) {        self.init(num: bigNum ? 10000 : 1)    }}class ClassB: ClassA {    let numB: Int    override init(num: Int) {        numB = num + 1        super.init(num: num)    }}

只要在子类中实现重写了父类convenience方法所需要的init方法的话,我们在子类中就也可以使用父类的convenience初始化方法了。比如在上面的代码中,我们在ClassB里实现了init(num: Int)的重写。这样,即使在ClassB中没有bigNum版本的convenience init(bigNum: Bool),我们仍然还是可以用这个方法来完成子类初始化:

let anObj = ClassB(bigNum: true)// anObj.numA = 10000, anObj.numB = 10001

因此进行一下总结,可以看到初始化方法永远遵循以下两个原则:

  1. 初始化路径必须保证对象完全初始化,这可以通过调用本类型的designated初始化方法来得到保证;
  2. 子类的designated初始化方法必须调用父类的designated方法,以保证父类也完成初始化。

对于某些我们希望子类中一定实现的designated初始化方法,我们可以通过添加required关键字进行限制,强制子类对这个方法重写实现。这样的一个最大的好处是可以保证依赖于某个designated初始化方法的convenience一直可以被使用。一个现成的例子就是上面的init(bigNum: Bool):如果我们希望这个初始化方法对于子类一定可用,那么应当将init(num: Int)声明为必须,这样我们在子类中调用init(bigNum: Bool)时就始终能够找到一条完全初始化的路径了:

class ClassA {    let numA: Int    required init(num: Int) {        numA = num    }    convenience init(bigNum: Bool) {        self.init(num: bigNum ? 10000 : 1)    }}class ClassB: ClassA {    let numB: Int    required init(num: Int) {        numB = num + 1        super.init(num: num)    }}

另外需要说明的是,其实不仅仅是对designated初始化方法,对于convenience的初始化方法,我们也可以加上required以确保子类对其进行实现。这在要求子类不直接使用父类中的convenience初始化方法时会非常有帮助。

作者:王巍(@onevcat),iOS和Unity3D开发者。

本文转载自:Swifter

(责编/唐小引)

一周消息树:我想创业,但不懂技术怎么办? GitHub迁移数据库,借助MySQL大行其道! 实例亲授:教你如何创建AR应用 iOS七年,苹果都为开发者准备了哪些工具? TIOBE 2014年9月编程语言排行榜:Java、C++跌至历史最低点 如何甄别具有软实力的IT应聘者? 避免关注底层硬件,Nvidia将机器学习与GPU绑定 盘点MIT Demo Day上4个最有前途的创业点子 IDF 2014第一天纵览:智能设备唱主角 时尚化才是可穿戴的未来 ASP.NET之父Scott Guthrie:借技术之力铺平未来之路 两年测试,NSA或将让其数据中心洗上油浴 【云先锋】数云:另类淘宝创业,瞄准背后百万卖家的数据挖掘 Xcode 6 GM、6.1齐出,Swift终迎1.0版! 我眼中的Devops——倍道而进! 英特尔物联网世界:提供开发工具包,实现万物互联 三十功名尘与土——我的程序员生涯自白 触摸未来:为什么说AR是未来最重要的人机界面? 科普:谈云计算中间件理念 能准确“猜透”玩家心理,深度学习让游戏更智能 阿里过程改进专家:看板核心在于拉动式管理过程+数据化支持改进 英特尔Edison全面上市,专为小型可穿戴设备设计 APM最佳实践:Web 2.0和AJAX四大优化战略 开放•创新•共赢 2014华为开发者联盟沙龙即将开幕 排名前十的SQL和NoSQL数据库 干货议题,中国互联网安全大会免费门票等你来! 【云先锋】红象云腾:Hadoop将和高铁一样改变我们的生活 IDF 2014上开发者最应关注的三件事之:原生应用兼容性篇 《近匠》WRTnode创始人罗未:OpenWrt,下一个时代的Android AMD爆新一代架构,代号Zen! 【问底】严澜:数据挖掘入门——分词 顺丰集团IT副总裁徐庆强:信息化技术支撑高质量服务 如何将一幅图片放大缩小? 如何在1台机器同时调试两个WEB服务? 在用frontpage 建立网页的超链接时, 字体颜色发生改变 为什么GetPrivateProfileSection只能读一行数据呢 100分大放送 操作符重载到底是怎么回事我看书也没怎么看明白? 请问如何截取两个sysdate之间的间隔秒数啊? 大家起讨论吧:VC与VC++的区别在于哪里. 寻求软件开发合作伙伴!要求具有行业素养,熟pb或delphi的个体或团队。在广大地区尤佳! 想做漂亮软件主页的朋友请看过来!!! 火焰算法! 专家不帮我??谁帮我???API调用的史无前例的super难题(PFXExportCertStoreEx) 各位大哥哥,帮帮小弟 如何动态改变frame的指向页面??? 请教!如何定位word中的某一个表格,如何取出表格中的内容?急呀!在线等待 如果有一个数组,希望所有的对象都能够读取它,而只有一个特别的对象能够修改它,在程序该怎么设计和实现? 如果有一个数组,希望所有的对象都能够读取它,而只有一个特别的对象能够修改它,在程序该怎么设计和实现? Datagrid 问题,为什么我按下一页到第二页就翻不下去了? 有效的用户名用正则表达式怎么写? 请问:如何控制for语句的执行时间?? *****上传文件的路径问题?(VB)******** 关于名字空间的问题(online waiting). 在Radhat8.0中如何更改显示器刷新率 intraweb问题 请教用intraweb开发的程序中如何用iwtimer定时 在线等待 小第想考mcse, 希望各位大虾多多支持 Delphi的DLL中是不是? 气疯我了,这句哪错了?update pubOther set value='100',time='2003-4-27 0:00:00' WHERE name='visited' 在对话框界面上的STATIC控件上,用CPaintDC dc(&m_static); 和 pdc = m_static.getdc(); 两种方法得到的dc上画图,为什么在界面刷新时的 需要安装什么防火墙? 我曾见过有些网页中从下面慢慢上升一段文字, 然后又慢慢消失,请问怎样搞的? 急:如何在VB中嵌如FLASH动画? 连接数据库错误,如何解决? 对不起:是VC++与C++.net的区别 比如一个做好的软件,怎么安装到机子上?? ~~~~!!!救火!!!!!!! help!!!! ~~~~!!!救火!!!!!!! 毕业设计求救!!!` 请大虾来帮忙 关于对话框的奇怪问题 该考MCAD还是MCSD for .NET?? 用什么软件播放本机的VOD文件? 请大家讨论!我起这个昵称合不合法!该不该被如此对待! 温度和湿度 急,急,请高手指教!答者再给高分! 温度和湿度 怎么制造更诱人生动的Hint? 关于response.sendRedirect()产生了一个新的session的问题 找不到硬盘了? 如何用vc修改磁盘某些磁道属性 关于全局对象和多线程? 54门大炮,一共28响.54和28分别表示什么? 请问:灭火器应该是以压力为标准还是以日期为标准 如何理解“尊重自然,敬畏生命” 黄金万两是什么? 求电线的各工序的成本计算公式.谢谢! 食物交换份法怎么使用我设计一天的食谱后怎么通过食物交换份法来更换食物,需要怎么计算需要的份数?能讲的详细些么 有人说,要想富,先修路,火车一响,黄金万两,这些话,说明了什么 我国北方某居民区有一座甲楼,坐落在正南正北方向,楼高16米,要在甲楼北面建一座乙楼,一直冬至这一天正午时太阳光线与水平线的夹角是32°.(1.如果甲乙两楼相距20米,求甲楼的影子落在乙楼 已经n∈N..n≥2.求证:1/2, 在死海上玩轻功水上漂死海盐分浓度还高人可以在上面漂浮,那岂不是不懂轻功的人也能在水面上玩轻功水上漂? 青年队的英文怎么说 哪位大师能详细讲解下电线电缆成本计算公式吗?比如说:铜=单支铜直径2*条数*0.7854*8.889*1.03*芯线根数*数量(km)这中间的单支铜直径2是具体指什么意思?还有条数是指什么?芯线根数指什么? 5分钟之内回答、 高手帮帮忙啊 最好讲下做法、 快已知 a,b,c 为三个不等于0的数 且满足abc>0, a+b+c IT精英是什么意思 电工穿绝缘鞋的目的是什么? 我看了下漏电保护器的工作原理,当人触摸到漏电设备时,电流会经过人体流入电工穿绝缘鞋的目的是什么?我看了下漏电保护器的工作原理,当人触摸到漏电设备时, 怎么判断离子键角大小 什么叫做IT精英 一颗质量为10g的子弹以200m/s的速度射入放在光滑水平面上质量为2kg的木块并穿出,穿出木块时子弹的速度变40m/s,在此过程中子弹和木块共获得多少内能?若着些内能有30%被子弹吸收,则可以使子 气相色谱点火点不着,怎么办? IT精英只得是那些人? 室外排水管道设置检查井原则 气相色谱FID不能点火的原因 竞争的利与弊,要谈到中学生的,带给我们中学生的弊 .是辩论赛哦 我是反方竞争的弊大于利 要把观点细微化 信念和理想有什么区别?信念和理想有什么区别? 气相色谱不点火怎么回事 想成为IT精英一般需要几年 两相邻检查井之间的管道是室外排水管还是室内排水管? 一个棱长为5分米的正方体水箱,里面装的水深是4分米,在这个水箱里放进一个网球,这时,水面上升到4.3分米,这个网球的体积有多大? 关于金钱的格言警句(3个)? 直径400的室外排水管几米一个接头 急() 好()成语,五分钟内给答案 当线路被雷击后,氧化锌避雷器能迅速通过间隙放电,以避免设备为雷电所伤,错在哪 今天电风扇用完之后.插头上两片金属特别烫怎么回事 溪流河川中闪闪发光的不仅仅是水,也是我们祖先的血液.那清澈湖水中的每一个倒影,反映了我们的经历和记忆;那潺潺的流水声,回荡着我们祖辈的亲切呼唤.河水为我们解除干渴,滋润我们的 下列哪些因素对空气间隙操作波冲击的放电电压值无影响?  A.操作波的极性(即正极性操作波还是负极性操作波);   B.操作行为的发生时刻;   C.被操作设备的地点;   D.操作的 房间有个灯,电源线与灯头线相接处发烫很厉害,灯泡老烧坏(装的100W 200W的灯)是不是灯头线太细,或接触不良引起?如果换瓦数小的灯泡(40W 60W)或将灯头线加粗,是否可以解决? 夸字怎么组词3个用 夸奖的夸 组词再组3个 谢 . RN2-10熔断器有爬电距离这个参数么?无间隙氧化锌避雷器有工频放电电压这个参数么? 有一座楼.坐落在正南正北方向楼高16米,要在甲楼的北面建一座乙楼.已知冬至这一天正午时太阳光线与水平线的夹角是32°1、如果甲乙的两楼相聚20米,求甲楼的影子落在乙楼上部分的高度2、 连词成句风尘仆仆、日夜兼程、 风餐露宿 美军军队编制 对应英语搞不清一个排 一个连 一个团等等 什么regiment啦 brigade啦 corps 哪是哪那DIVISION?呢 某小区有一朝阳向为正南方向的居民楼,该居民楼的一楼是高6米得小区超市,超市以上是居民住房.该楼的前面24米处要盖一栋高20米得新楼,当冬季政务的杨过与水平显得价较为32度时(1)问超 风餐露宿和风尘仆仆的意思是什么? 英语片中,部队表示收到的词是什么?好像是broterdan.是什么啊波绕特儿蛋 什么是“格式试剂”?一种化学物质 快来帮帮我,急求答案,5分钟内搞定高分悬赏诸葛亮的一生经历用2副对联概括了,请分别指出具体所指:两表:一对:二川:八阵:六出:七擒:东和:北拒: 2012年高一寒假作业答案(东南大学出版社)【语.数.英.理.化】我们老师把答案撕了 你有可不可以发给我拜托 求教.格式试剂?格式试剂.的师傅.我在三口烧瓶中置入101克镁粉.再加入100克无水乙醚.渗未镁粉.再用滴液漏斗装着100克溴乙烷.滴液漏斗开启.慢慢滴瓶中.反应开始.但是一下就把乙醚蒸干了.请 我要一个作文的卷首语300字内的,关于文学,语文之类的卷首语 军队中的旅用英文怎么说? 40W 台式电风扇,使用后接线及插头出现发热是怎么回事?家里的台式电风扇,40W 功率,用了七八年了,现在发现使用后接线及插头会出现发热.这说明功率已经达到上千瓦了? 谁能给我班,排,连,营,团,旅,师,军的英文名? 参加军队英语应该怎么说?Join in army还是Join army 还有,要不要the呢?我觉得应该是不能要吧! 向正南与坐正南的方向区别 这个英语名字怎么念请问 Rueey 跟 Ruee 的念法是相同的吗?如果不同的话 Rueey 和 Ruee分别是怎么念的? 天的高度是否可以说是大气层的厚度,地的厚度是否可以说是从地表到地心的距离 广州市的正南方向是在哪里阿?广州市的正南方向是在哪里阿?你知道广州的正南方在哪个位置吗 麻烦你们啦? 中国IT界最牛的十个人 湖南省浏阳市安彩烟花化工 有这公司吗 还想请问您,如果有利方位是南方的话,如何确定这个所谓的南方?就是说西南、正南、东南以什么作为界限? 美国十年逾百起医院枪击事件 FBI探利比亚枪手狂劫五千万美元演员有怪癖 只爱演死尸纽约手机可接收紧急警报捐肾牵良缘 悲剧变喜剧四条眼镜蛇盘绕 “守护”婴儿午睡印度高官建议用阉割强奸犯方法遏制强奸世行营商环境排名遭质疑公务报销作假引发公众愤慨 加拿大政府奥巴马考虑停止窃听盟国领导人泰国前总理阿披实被控谋杀英国报纸窃听丑闻开庭审理普京称苏联共青团不仅是政治还是友谊和美主持人就\"杀光中国人\"言论道歉美国承诺停止监听盟国美媒:光有“屌丝”与“土豪”社会无法港媒:防范儿童性侵别忘了农村蒙古总统到参谒朝鲜锦绣山太阳宫法学家徐显明履新中央政法委 原任山东帅气男子微信诈骗 三个姑娘心甘情愿掏18岁高中生转塘突发意外生命垂危 警社区百姓看病容易了吗OPPO到底拿啥征服安卓专利?闪充o电影八卦 l 离了还在秀恩爱!陈赫你这些过敏原潜伏在你身边 不易察觉【手工美食】绿茶酥《中国暗杀王》第2章 王亚樵何许人孕妈秋季穿衣遵循4原则 3个搭配方案最晚下周一市场冲高后减仓!李敖:蒋介石如何用心机当上的黄埔军校孩子身型瘦小是发育不良还是病本轮股市暴跌 家庭理财暴露出哪些问题正是孤独让你变得出众,而不是合群《大秧歌》:郭靖宇2亿打造的郭式传奇比司吉蛋糕26岁中国前投行女,离开英国巴克莱,再现千股涨停,股民已不再疯狂!!最牢固的感情,大都势均力敌 | 被窝【手工美食】酱香烤鸭全世界都在讨论谷歌的积木手机 不V Time·群英汇-O2O先锋企业水晶头颅 神秘的墓碑 至今未解之神秘
备案号:鲁ICP备13029499号-2 说三道四 www.s3d4.cn 说三道四技术文摘