未设置存储的 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
}
我正在编写一个应用程序蓝牙控制的 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
}