为什么#if init不能在Swift结构中使用私有var?

时间:2019-02-17 02:29:12

标签: swift macos struct ncurses

在研究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行(含)。

1 个答案:

答案 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部分中的代码的行为。