未设置存储的 Swift 初始化程序失败 属性

Failing a Swift initializer without setting stored property

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

考虑这个 class,它需要使用可选的 OSALanguage 初始值设定项。

class KeynoteController {

    let applescriptLanguage: OSALanguage

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

}

在此示例中,如果没有名为 "AppleScript"OSALanguage,我希望初始化 KeynoteController 失败(不可否认,这不太可能,但设计不错)。但是,在填充所有存储的属性之前,我无法从初始化程序中 return。

我可以使 applescriptLanguage 成为可选的,但由于它不是可选的,并且如果初始化成功则为常量,这似乎是一个 hack。

正确的设计方法是什么?

问题似乎来自试图使 applescriptLanguage 成为非可选项。编译器希望它被赋值,即使对象初始化失败。

通过将其设为可选来修复它 属性(隐式解包,因为它在初始化后实际上不应该为 nil)。

let applescriptLanguage: OSALanguage!

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

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

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