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

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

(责编/唐小引)

三星电子大中华区副总裁黄伽卫:构建移动互联生态,解读内容服务新方向 MDCC 2013移动开发者大会:新浪潮,新硬件! 网站建设,如何平衡产品特性和利益需求? 开发者是如何提升技能水平的 Databricks核心成员专访:大数据时代“智能手机”Spark 数据密集、快速启动、核心应用,IBM存储重兵布阵 企业移动应用与BYOD:移动互联大势所趋 “首届智能硬件峰会”上午会议亮点汇总 代价究竟高不高,苹果为什么要在Android专利诉讼上花费2亿美元? 产品与设计专题论坛(下):App之美 产品与设计专题论坛(上):扁平还是拟物?产品说了算! 首届移动娱乐游戏峰会:中外手游的交锋与对抗(下) 研发人员超过500,基金会金牌会员,华为豪赌OpenStack New way of thinking:索尼SmartWatch 2应用开发马拉松大赛圆满结束 离了你地球照样转,谷歌地图并非苹果的必需品 面试必备的9大成功秘诀 Chuck Goldman:乔布斯从来不会说苹果不是企业应用的公司 全球最大的图片社交分享网站Pinterest发布首个API UX设计程序的五个谬论 研发周报:2013年美国开发者薪资调查报告 【开源推荐】PredictionIO:构建预测功能的机器学习服务器 只需4步 百度SiteApp助力京华网移动版落地 Windows Azure开放公测5个月的收获 RDS添加PostgreSQL支持 几家欢喜几家忧 首届智能硬件峰会:解读硬件创业机遇与挑战(下) 平台与技术专题论坛(二):游戏开发实践分享及IE11新体验 看Twitter上市后的入职面试题 六届中国大数据技术大会PPT精粹(三) AMD推多款异构计算开发工具 着力打造APU软件生态系统 Ceylon 1.0发布:又一个“Java语言替代品”? HTML5开发工具:英特尔XDK New 有人给你送礼希望你能....你会如何? 我该选哪一个?(在线等) 请问如何在word里嵌入一个工具条 我的一台服务器安装的是Win2000 Server版,而客户端安装的是Win98,当通过客户端的Win98系统去访问服务器时,就会弹出一个要求输入网络密 两个问题请教,做过大项目的请来帮忙 傻问题大家帮帮忙 简单问题!请指点(急!在线等!) 讨论:是用全局变量,还是用发送消息? 关于jsp与javascript之间的问题,紧急!!!对高手的挑战 我想写一个窗体,要使它不在任务栏上 如何用php语法进行文件的直接下载,高手请进 怎样利用CFile类来完成创建多个文件夹? 请exee、jasminelai、smart2me、patricklee01() 、greenazcf进来拿分!!! 请各位帮个忙,FileAge()、raise是什么意思?虽然是简单希望各位帮忙!! 怎样做个SPY++查不到句柄的控件? 请教表格自适应的问题 知道并了解VCL底层运作机制的朋友切磋一下好吗? VB如何调用RAR? 控制台程序中字符串的定义问题 ====高分求助!!===== 請問如何設置table使之在dba studio 看不到但是通過sql/plus可以看到 一个关于表单的简单问题<select name=..>中怎样确定选定的是第几项 ==找错!!! 两行代码,错在哪儿??== 有谁知道SQL SERVER为什么会占用600多M的内存? VB如何调用RAR? ====高分求助!!===== 哪位大侠知道可以下载电子书籍的好网站~~~(当然是关于计算机的。。。) 关于winrunner的delphi插件问题 截取swf动画里面的图片用什么软件,下载地址有吗? 上网速度慢?为何? win2000,安装在C:,NTFS格式,由于误操作,现在无法进入,出现提示为:missing operating system,怎么解决,急!(不想格式化重装) 请问如何在word里嵌入一个工具条 有关对话框的状态栏的问题? 怎样用DOM调用在服务器端动态生成的元素? 昨夜冻的肚子疼,不爽! 散分。 请大家帮帮我,水晶报表问题!! 小弟做了一JSP应放在哪个目录下? 小闪小蹦一把:偶来看看大家了,最近都好吧 :D 请问用什么方法,或什么控件可以实现新闻管理阿? Exception in thread "main" java.lang.NoClassDefFoundError: PrintPen 用jbuilder9编写bean的问题 update 问题谁来帮我看看。 listview的排序问题(在线等,请各位高人指点!) 请问谁做过烧录光盘的程序?谢谢 对FILE进行写操作,怎么FILE原来的内容没有了? 请教一个C#的问题,在线等! 请教Unicode的编码格式 刚刚接触vc,遇到不少问题…… 询问一条语句 如何将文件以binarry的形式存储在ACCESS中的"OLE对象"字段中,急!在线等待!!! 我机上的IE看所有的web页,如代码里有<font>,则字体看起来都变大了,几番变化,郁闷中。。 包饺子用的三鲜馅,用1份虾仁,3份菜,2份鸡蛋混合而成,其中虾仁质量占总质量的多少,鸡蛋占总质量的多少? 왼손什么意思 though making sure the money to do research is there for the period of your graduate degree is important WOOL 是哪种成分 百分百羊毛 WOOL 100怎么样 wool是不可数的吗? BEAUTY WOOL怎么样 porridge的中文意思? The new order will mean ___ overtime.选项:a、to workb、workingc、workd、to be working The UK will __ __ __ __ the 2012 Olympics.英国将举办2012年奥运会. 英语翻译帮我翻译下 南京富二代杀妻案庭审结束 被告人愿赔日媒:中国和日本被美国列入“重点监视台向美购阿帕奇战机抵台组装测试(图)台向美购阿帕奇战机组装过程曝光(组图克里急赴中东安抚盟友沙特中国梦惠及非洲英超市香蕉出剧毒蜘蛛 全家躲出三晚消美海军一教练机坠毁 两飞行员受伤送医曝孙杨所载女子为新女友 已与大5岁空独家:小沙丘 大文章——本网记者探访韩国总统朴槿惠赴英访问 重点商讨经济印度男子用火理发引当地民众追捧 顾客英国权威字典公布2016年度十大代表研究称全球排碳量若不下降 2040年外媒:中国多地机场设女性安检专用通道洱海源头话生态 全国网媒大理行看洱源云南小龙高速公路对龙河大桥整桥合龙 节俭办会 第十二届昆明农博会办会费用暖闻|湖南拾荒老人被骗光积蓄欲轻生,辽宁一受保护动物海雕断喙,志愿者希望合肥反腐挽回经济损失6.8亿 党政纪新型超高性能混凝土首次应用大型桥梁
备案号:鲁ICP备13029499号-2 说三道四 www.s3d4.cn 说三道四技术文摘