【问题标题】:Extension of a nested type in SwiftSwift 中嵌套类型的扩展
【发布时间】:2016-06-10 22:36:27
【问题描述】:

我有一个主类,也提供了一个命名空间:

class A {
}

以及通过扩展添加的嵌套类(都是为了使用单独的文件):

extension A {
  class B {
  }
}

我想通过扩展嵌套类 (B) 来为其添加功能;我试过了:

extension A.B {
}

我得到“'B' 不是 'A' 的成员类型”。

(我也尝试了一些不太合理的事情,但我将在此处省略它们以避免尴尬。阅读 Swift 文档和谷歌搜索“快速嵌套类扩展”也没有得到答案。)

知道是否以及如何实现吗?


更新:

此代码在单个文件(或 Playground)中按预期工作,感谢 user3441734 试用!

当这 3 个部分位于单独的文件中时仍然无法工作,这可能是 Swift 编译器当前实现中的一个错误。我将向 Apple 提交错误报告。

【问题讨论】:

  • 您使用的是哪个版本的 Xcode/Swift?
  • 嗨,马丁。需要明确的是,每个定义都在一个单独的文件中。既然如此,我刚刚设法在 Xcode 7.3.1 中用 Swift 2.2 重现了这个问题。如果您将所有定义放在一个文件中(就像下面答案中的游乐场一样),一切正常。换句话说,这不是 Swift 本身的问题,而是编译器的问题。

标签: swift2


【解决方案1】:

这个问题似乎与SR-631 有关。我遇到过类似的问题,我猜编译器正在尝试处理您在定义嵌套类之前扩展嵌套类的文件。因此,您有此错误,表明 A 没有成员 B。

我找到的解决方案是转到您的目标设置,打开Build Phases

Compile Sources 部分中,您应该将定义嵌套类的文件放在扩展它的文件之上。

更新

fix 将随 Xcode 10.2 一起发布

【讨论】:

  • 感谢您的回答!源的排序解决了问题这一事实可能意味着编译器在解析符号时需要经过一定数量的传递,而这种情况超出了这个数量。我已经向 Apple 提交了一份错误报告,希望他们能在未来的 Xcode 版本中对此有所作为。
  • 在通过命令行界面使用 swift 编译器时有没有办法解决这个问题?
  • @cnotethegr8 Pods 重新创建 Xcode 项目并按字母顺序将它们添加到 Compile Source 列表中...
  • 谢谢你。
【解决方案2】:

正如预期的那样,这在我的操场上有效

class A {
}
extension A {
    class B {
    }
}
extension A.B {
    func foo() {
        print("print from extension A.B")
    }
}
let ab = A.B()
ab.foo()    // print from extension A.B

【讨论】:

  • 确实如此。我认为,这是 Xcode 中当前 Swift 实现如何处理文件的一个错误。我将向 Apple 提交错误报告。谢谢!
猜你喜欢
  • 2023-01-10
  • 2020-08-18
  • 1970-01-01
  • 2019-02-03
  • 1970-01-01
  • 2019-11-11
  • 2019-05-29
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多