簡體   English   中英

迅速:推遲非可選對象的初始化

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM