標籤:
開發中常見錯誤和警告總結(三十二)
百思不得姐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開發——錯誤總結篇&開發中常見錯誤和警告總結(三十二)