[英]swift: defer non-optional object initialization
使用CocoaTouch撥號時,經常會發生UIView(Controller)子類屬性無法在init
方法中init
(例如,我們需要已加載視圖),但是從邏輯上講,它們是非可選的,甚至是非var。 在這種情況下,該屬性必須是可選的,才能進行編譯而不會出現錯誤,這看起來很難看-代碼用!
來實現!
。
有什么辦法解決這個問題? 我會想象一些延遲的初始化。 如果此類屬性可以在沒有初始值的情況下進行編譯,並且如果在初始化之前進行了訪問,則在運行時崩潰,則是完美的選擇。
一些代碼示例來描述問題:
class MyVC: UIViewController {
@IBOutlet var someLabel: UILabel!
let viewBasedParam: CustomClass // how to keep it non-optional if it can be initialized after view has been loaded?
override func viewDidLoad() {
super.viewDidLoad()
self.viewBasedParam = CustomClass(self.someLabel.text)
}
}
PS CustomClass
不能具有默認的初始化程序,因為它需要視圖中的數據。
在MyVC
您可以使用convenience
init
方法來初始化let
變量。 試試這個,讓我知道它是否適合您:
class MyVC: UIViewController {
let viewBasedParam: CustomClass
convenience init() {
self.init(nibName:nil, bundle:nil)
self.viewBasedParam = CustomClass(self.someLabel.text)//else just initialize with empty string here and then assign actual value in viewDidLoad
}
}
據我發現,解決方法可能如下:
class MyVC: UIViewController {
@IBOutlet var someLabel: UILabel!
private var _viewBasedParam: CustomClass? = nil
var viewBasedParam: CustomClass {
get { return self._viewBasedParam! } // always unwrap private optional
set { self._viewBasedParam = newValue }
}
override func viewDidLoad() {
super.viewDidLoad()
self.viewBasedParam = CustomClass(self.someLabel.text)
}
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.