swift: 推迟非可选对象初始化

swift: defer non-optional object initialization

使用 CocoaTouch 拨号时,经常会发生 UIView(Controller) 子类属性无法在 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)
    }
}

P.S。 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)
    }
}