swift - 为什么 Swift 结构中的私有(private)变量在该结构的#if'd init 中不可用?

标签 swift macos struct ncurses

在研究 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/

相关文章:

linux - 以 root 身份获取 Firefox 版本

c++ - C++结构可以有成员函数吗?

c - 释放链表中的节点

swift 4 : Issues passing data from one NSViewController to another

objective-c - 使用共享 Web 凭据时禁用弹出窗口(直接工作)

ios - 核心蓝牙的两个实例

ios - 如果用户禁用它们,如何发送静默推送通知?

macos - 未找到 CoreImage.framework

ios - swift 中的 NSTask 环境变量

c# - 用于患者管理的列表/数组