标签:
百思不得姐Swift版经典错误
问题描述:
fatal error: use of unimplemented initialer for class
如下:
代码二:
1 import UIKit 2 class ViewController:UIViewController{ 3 var data:String? 4 5 init(para:String){ 6 //那么参数 放这里初始化呢 self.data = para 7 super.init() 8 //还是放这里初始化呢 self.data = para 9 } 10 required init(coder aDecoder: NSCoder) { 11 fatalError("init(coder:) has not been implemented") 12 } 13 override func viewDidLoad(){ 14 super.viewDidLoad() 15 } 16 }
尽管你有一个init(para:String)
构造器,还有一个requried init()
,但仍然不可避免运行时候报错fatal error: use of unimplemented initialer init(nibName nibNameorNil:String?,bundle,nibBundleOrNil:NSBundle?)
类似这种
解决方法:
添加函数:
init(nibName nibNameorNil:String?,bundle,nibBundleOrNil:NSBundle?){
super.init(nibName:nibNameorNil,bundle:nibBundleOrNil)
}
这里有个问题,也是前面代码注释中提到的,初始化参数放哪里?你可以试试用let vc = ViewController(para:"Hello")
初始化一个ViewController,你会发现self.data = para
放哪里结果是不一样的,放在super.init()前面初始化会最后变成nil
,后面则不影响。
init()有个条例,先将本实例的属性值都初始化,再添加上super.init()
,假如你要修改父类的参数,再在之后赋值覆盖掉!但是貌似和我们完全不同。其实你忽略了一个问题:
注意 我们调用了
super.init()
而非super.init(nibName:nil,bundle:nil)
是的,问题的关键就是这里。另外为什么放在super.init()之后是没有问题的呢?因为let vc = ViewController(para:"Hello")
先跳入init(para:String)
方法,执行到super.init()
又会跳到
init(nibName nibNameorNil:String?,bundle,nibBundleOrNil:NSBundle?)
方法。执行完在跳回来。很有意思的东西 大家可以研究一下。
iOS开发——错误总结篇&开发中常见错误和警告总结(三十二)
标签:
原文地址:http://www.cnblogs.com/iCocos/p/4790414.html