在研究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
声明中删除了private,那么在两个范围内都可以。但这会使变量internal
并使它可以在结构外部访问,这是不正确的。
这也可能只是我不熟悉的Swift #if
构造的行为。
我已经搜索了平常的地方,包括此处的SO。在这种情况下,没有类似的东西可以解决,至少在我使用的搜索词方面没有。
任何提示或技巧将不胜感激。
P.S。如果您想查看IOGUI的来源,我特别指的是MenuWidget.swift的第41行和第78-100行(含)。
答案 0 :(得分:1)
这不是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
部分中的代码的行为。