在对ncurses进行一些研究以及如何在Swift中使用它时,我看了一下IOGUI。
它不能正确编译,所以我开始清除警告和错误。
就在那时,我偶然发现了一些我不知道的Swift微妙之处。
注意:我不是在讨论下面的编译错误。此问题特定于Xcode完成的解析,以指示代码编辑器中的警告和错误。
参考以下结构:
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
声明中删除私有,那么它在两个范围内都没问题。但这使得变量internal
并使其可以在结构外部访问,这是不正确的。
它也可能只是我不熟悉的Swift #if
构造的行为。
我搜索了常见的地方,包括在这里。没有类似的处理这个特定的场景,至少没有与我使用的搜索术语。
任何提示或技巧将不胜感激。
附:如果你想查看IOGUI源代码,我特别指的是MenuWidget.swift的第41行和第78-100行(含)。
这不是if
构造;这是一个#if
构造。这意味着只有一个#if
/ #endif
块甚至编译。对于所有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
部分内部的代码是如何运作的。