OC中經常用到的一種初始化控制器的方法.比如A push B.並且將A的一個值:value 傳遞給B 使用.簡單的辦法就是 在B重構init方法.比如在.h 中定義: ()initValue:(NSString )value; 然後在.m中實現 ()initValue:(NSString )valu ...
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()方法只會調用一次.是線程安全的.