OC中经常用到的一种初始化控制器的方法.比如A push B.并且将A的一个值:value 传递给B 使用.简单的办法就是 在B重构init方法.比如在.h 中定义:

- ()initValue:(NSString *)value;

然后在.m中实现

   -()initValue:(NSString *)value {
self = [super init];
if (self) {
self.value = value;
}
return self;
}

但是如果在swift中也这么写.那么就会出现问题了.

   class B:UIViewController {
var param:String?
init(param: String) {
super.init()
self.param = param
}
报的错误是:
‘required‘ initializer ‘init(coder:)‘ must be provided by subclass of ‘UIViewrController‘
Super.init isn‘t called before returning from initializer

看到这个错误的时候,很迷惑.哪里错了?然后开始查找资料

1,在 Swift 中, 类的初始化器有两种, 分别是Designated Initializer(指定初始化器)和Convenience Initializer(便利初始化器)
2,如果子类没有定义任何的指定初始化器, 那么会默认继承所有来自父类的指定初始化器。
3,如果子类提供了所有父类指定初始化器的实现, 那么自动继承父类的便利初始化器
4,如果子类只实现部分父类初始化器,那么父类其他的指定初始化器和便利初始化器都不会继承。
5,子类的指定初始化器必须要调用父类合适的指定初始化器。

那么原因就很明显了.修改一下,就可以正常传值了

 init(value:String){
self.value = value
super.init(nibName: nil, bundle: nil)
} required init?(coder aDecoder: NSCoder) {
fatalError("init(coder:) has not been implemented")
}

一般来说,子类的初始化顺序是:

设置子类自己需要初始化的参数,valu = 10
调用父类的相应的初始化方法,super.init()
对父类中的需要改变的成员进行设定,name = "name"

其中第三步是根据具体情况决定的,如果我们在子类中不需要对父类的成员做出改变的话,就不存在第 3 步。而在这种情况下,Swift 会自动地对父类的对应 init 方法进行调用,也就是说,第 2 步的 super.init() 也是可以不用写的 (但是实际上还是调用的,只不过是为了简便 Swift 帮我们完成了)

  如果我们不需要打改变 name 的话,
虽然我们没有显式地对 super.init() 进行调用
不过由于这是初始化的最后了,Swift 替我们自动完成了

这就是对于init传值的一种记录吧

ps:因为Swift的特性.init()方法只会调用一次.是线程安全的.

最新文章

  1. jquery.datatable.js与CI整合 异步加载(大数据量处理)
  2. Alamofire 的使用
  3. 查看/关闭SElinux (原创帖,转载请注明出处)
  4. Python之什么是函数
  5. 【solr】solr5.0整合中文分词器
  6. SecureCRT、FileZilla使用Public证书登录Linux
  7. 工程和界面—Webstorm入门指南 Webstorm中的工程-备
  8. iOS设计模式解析(六)代理模式
  9. GDI+ 填充背景时,非常多时候不起作用,GDI、GDI+配合运用
  10. Lucene.Net 2.3.1开发介绍 —— 三、索引(五)
  11. 寻找失踪的整数数组(Find the missing integer)
  12. python中的线程之semaphore信号量
  13. 关于接口(Interface)
  14. java中移位运算
  15. $Django 站点:样式--文章--分类文章--文章详情--文章评论点赞--文章评论点赞统计(数据库优化)
  16. 【Java】设计模型-五种单例模型
  17. script标签中type为"text/x-template"或"text/html"
  18. @Resource 注解的使用
  19. maven项目中利用jmeter-maven-plugin插件直接执行jmeter jmx脚本
  20. VLAN,GRE,VXLAN

热门文章

  1. Bootstrap Affix(附加导航(Affix)插件的用法)
  2. SAML 2.0 setup steps, 效果图
  3. Linux 视频设备驱动V4L2最常用的控制命令
  4. R语言解读多元线性回归模型
  5. Python3基础 创建一个空列表,一个空元组
  6. js创建节点及其属性
  7. Query Designer:Hierarchy层级显示
  8. Android sdk目录介绍
  9. 【树莓派】关于tinyproxy问题处理
  10. what is difference in (int)a,(int&)a,&a,int(&a) ?