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

时间:2016-07-26 17:15:16

标签: ios swift initialization optional-parameters

当使用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无法使用默认初始值设定项,因为它需要查看数据。

2 个答案:

答案 0 :(得分:0)

在您的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
    }
}

答案 1 :(得分:0)

据我所知,解决方案的解决方案可能如下:

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)
    }
}