在研究 ncurses 以及如何在 Swift 中使用它时,我看了一下 IOGUI .
它无法正确编译,所以我开始清除警告和错误。
那时我发现了一些我没有意识到的 Swift 微妙之处。
Note: I'm not discussing compilation errors below. This question is specific to the parsing done by Xcode to indicate warnings and errors in the code editor.
引用以下结构:
public struct MenuWidget {
var widgetRows: Int
// CUT
private var startRow: Int
#if os(Linux)
public init(startRow: Int, widgetSize: Int, choices: [GUIMenuChoices], delegate: @escaping MenuChoicesSelectionDelegate, mainWindow: UnsafeMutablePointer<WINDOW>) {
self.startRow = startRow
// CUT
initWindows()
}
#else
public init(startRow: Int, widgetSize: Int, choices: [GUIMenuChoices], delegate: @escaping MenuChoicesSelectionDelegate, mainWindow: OpaquePointer) {
self.startRow = startRow
// CUT
initWindows()
}
#endif
// CUT
} // END STRUCT
在 #if os(Linux)
部分,self.startRow
被标记为无法从该范围访问。
但是在#else
中,没有错误指示。 widgetRows
可在 #if
和 #else
如果我从 startRow
声明中删除 private,那么它在两个范围内都没有问题。但这使得变量成为 internal
并使其可以在结构之外访问,这是不正确的。
它也可能只是我不熟悉的 Swift #if
构造的行为。
我已经搜索了常见的地方,包括 SO 的这里。没有类似的处理这种特定情况,至少不是我使用的搜索词。
如有任何提示或提示,我们将不胜感激。
附言如果你想查看 IOGUI源代码,我特别指的是 MenuWidget.swift 的第 41 行和第 78-100 行(含)。
最佳答案
这不是if
结构;它是一个 #if
结构。这意味着只有一个 #if
/#endif
block 甚至可以编译。对于所有 Swift 编译器关心的问题,另一个可能完全是胡说八道;编译器甚至都看不到它。这就是条件编译的意思。因此,如果您不在 Linux 上,则无法了解 #if
部分中的代码的行为方式。如果这样说,代码将是一样的:
#if os(Linux)
public init(startRow: Int, widgetSize: Int, choices: [GUIMenuChoices], delegate: @escaping MenuChoicesSelectionDelegate, mainWindow: UnsafeMutablePointer<WINDOW>) {
zampabalooie and a hot-cha-cha
}
#else
public init(startRow: Int, widgetSize: Int, choices: [GUIMenuChoices], delegate: @escaping MenuChoicesSelectionDelegate, mainWindow: OpaquePointer) {
self.startRow = startRow
// CUT
initWindows()
}
#endif
如果您不在 Linux 上,那将编译得很好 — 但这并不能使您开始得出关于 Swift 对某些惊人的“zampabalooie”的知识或其在术语之间突然使用空格的知识的结论。
相反,如果您在 Linux 上,则无法知道 #else
部分中的代码的行为方式。
关于swift - 为什么 Swift 结构中的私有(private)变量在该结构的#if'd init 中不可用?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54729589/