【问题标题】:Using a Swift struct in an NSOutlineView在 NSOutlineView 中使用 Swift 结构
【发布时间】:2016-12-09 08:55:15
【问题描述】:

我正在尝试使用 Swift 结构作为其项目填充 NSOutlineView。这有效,但 row(forItem:) 方法除外,它总是返回 -1。 我确保我的结构符合Equatable 并且我实现了isEqual 函数。仍然NSOutlineView 找不到任何项目的行。

如果我将我的结构转换为一个类(不是从 NSObject 派生的),那么一切正常。即使不符合Equatable 或实现任何isEqual 功能。

我认为 Swift 中的类和结构基本相同,只是一个是引用类型,另一个是值类型。

我需要实现什么才能将 Swift 结构用作 NSOutlineView 中的项目?

【问题讨论】:

    标签: swift cocoa


    【解决方案1】:

    有人在 Apple 开发者论坛上发帖 a similar question

    NSOutlineView 在识别项目时不使用 Equatable,它使用指向该项目的引用指针。在 Swift 中,结构总是按值传递(而不是按引用传递),因此大纲视图永远不会识别出您传递的项目是相同的。将你的结构切换到一个类解决了这个问题,因为 Swift 使用通过引用传递类。

    不幸的是,没有办法使用 Structs 作为项目来使用 NSOutlineView,您需要使用一个类。

    阅读this answer 了解有关 Swift 如何使用按引用传递与按值传递的更多详细信息。

    【讨论】:

      【解决方案2】:

      macOS 10.14 的发行说明指出,如果 Swift 值类型同时符合 Equatable 和 Hashable 协议,则 NSOutlineView 将成功使用该值类型。

      但如果您针对较旧的 SDK 构建,值类型将无法与 NSOutlineView 一起使用。

      【讨论】:

      【解决方案3】:

      您可以通过简单地查看所有行并返回相等行的索引来覆盖子类中的方法row(forItem item: Any?)

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2021-12-10
        • 2020-08-17
        • 2014-07-25
        • 1970-01-01
        • 2014-11-28
        • 1970-01-01
        相关资源
        最近更新 更多