码迷,mamicode.com
首页 > 移动开发 > 详细

iOS开发——错误总结篇&开发中常见错误和警告总结(三十二)

时间:2015-09-08 01:46:29      阅读:215      评论:0      收藏:0      [点我收藏+]

标签:

开发中常见错误和警告总结(三十二)

百思不得姐Swift版经典错误

 

init method 关键知识点

问题描述:
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

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!