我正在编写一个应用程序蓝牙控制的主题演讲遥控器。这将使用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
成为可选项,但由于它是非可选的,如果初始化成功则不变,这看起来像是一个黑客。
设计这个的正确方法是什么?
答案 0 :(得分:3)
问题似乎来自于尝试使applescriptLanguage
成为非可选项。编译器希望为它分配一个值,即使该对象初始化失败。
通过使其成为可选属性来修复它(隐式解包,因为它在初始化后实际上永远不会为nil。)
let applescriptLanguage: OSALanguage!
这对我来说似乎是编译错误,但我不知道幕后发生了什么。
或者,您可以暂时将其分配给else块中的虚拟值。这增加了额外的初始化时间和内存分配,所以可能不是最好的主意,但是如果真的希望将属性设置为非可选项,它就会起作用。
} else {
self.applescriptLanguage = OSALanguage()
return nil
}