在没有设置存储属性的情况下使Swift初始化程序失败

时间:2015-01-19 20:43:39

标签: swift optional

我正在编写一个应用程序蓝牙控制的主题演讲遥控器。这将使用AppleScript基于与CoreBluetooth框架的交互来控制Keynote。

考虑这个类,需要使用可选的OSALanguage初始化程序。

class KeynoteController {

    let applescriptLanguage: OSALanguage

    init?() {
        if let applescriptLanguage = OSALanguage(forName: "AppleScript") {
            self.applescriptLanguage = applescriptLanguage
        } else {
            return nil // Compile error on this line
        }
    }

}

在此示例中,如果没有KeynoteController名为OSALanguage(我认为不太可能,但设计良好),我希望无法初始化"AppleScript"。但是,我无法从初始化程序返回,直到填充了所有存储的属性。

我可以使applescriptLanguage成为可选项,但由于它是非可选的,如果初始化成功则不变,这看起来像是一个黑客。

设计这个的正确方法是什么?

1 个答案:

答案 0 :(得分:3)

问题似乎来自于尝试使applescriptLanguage成为非可选项。编译器希望为它分配一个值,即使该对象初始化失败。

通过使其成为可选属性来修复它(隐式解包,因为它在初始化后实际上永远不会为nil。)

let applescriptLanguage: OSALanguage!

这对我来说似乎是编译错误,但我不知道幕后发生了什么。

或者,您可以暂时将其分配给else块中的虚拟值。这增加了额外的初始化时间和内存分配,所以可能不是最好的主意,但是如果真的希望将属性设置为非可选项,它就会起作用。

} else {
    self.applescriptLanguage = OSALanguage()
    return nil
}