为什么不在#if的init中为该结构提供Swift结构中的私有var?

问题描述 投票:1回答:1

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

swift macos struct ncurses
1个回答
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部分内部的代码是如何运作的。

© www.soinside.com 2019 - 2024. All rights reserved.