为啥我的 Swift 类的扩展在定义文件之外不可见?

Posted

技术标签:

【中文标题】为啥我的 Swift 类的扩展在定义文件之外不可见?【英文标题】:Why is the extension of my Swift class not visible outside the defining file?为什么我的 Swift 类的扩展在定义文件之外不可见? 【发布时间】:2014-11-24 12:39:12 【问题描述】:

我的 CoreData 模型有一个 Xcode 生成的 NSManagedObject 类。

@objc(SomeClass) class SomeClass : NSManagedObject  /* ... */ 

它在一个名为“SomeClass.swift”的文件中定义。我想扩展这个类,所以我创建了“SomeClassExtension.swift”。我这样定义扩展名:

extension SomeClass 
    class func typeMethod1() 
    func instanceMethod2() 

这些扩展方法可以在这个定义文件中使用,但它们在它之外是不可见的。是什么导致了这个问题?

【问题讨论】:

【参考方案1】:

我没有在这些方法上看到任何公共修饰符。

【讨论】:

默认情况下,Swift 中的所有内容都是“内部”的,因此一个文件中的声明应该对另一个文件中的代码可见,只要它们是同一构建目标的一部分。 是的,这实际上是一个公平的观点。如果一切都在同一个目标中,那就是。 @NateCook 嗨,内特。那么有没有一种方法可以在 Swift 中隐藏定义和实现细节(对于 vars 广告方法),就像在 Objective-C 中通过仅将内容放在 .m 文件中一样?谢谢。 @Unheilig Swift 具有基于文件和模块的访问控制,带有 publicinternalprivate 修饰符,这是一种与头文件非常不同的方法。你可以在Swift Language book阅读更多内容。 @NateCook 对;我记得在发布问题后。我太累了,我问。非常感谢您的回复。【参考方案2】:

听起来您的新文件 (SomeClassExtension.swift) 没有包含在正确的目标中。通过在 Xcode 中选择文件,然后打开“文件检查器”(查看菜单 > 实用程序 > 显示文件检查器)来仔细检查文件的目标成员资格。确保在 Target Membership 标题下检查了正确的目标。

【讨论】:

我最终取消选中目标并重新检查它。这为我解决了问题。 有人找出问题所在吗? 我遇到了同样的错误,但是我的应用程序编译时发现错误,因为它在编译过程中消失了。非常奇怪和烦人(Xcode 7.1.1)。 奇怪;必须是索引问题;从 AppDelegate 调用扩展程序中的一个函数后,错误消失在其他使用函数的地方 - 我现在可以从任何地方访问它们。 这是一个非常有用的解决方案。对我来说,这个问题是通过解决版本控制系统中的冲突产生的。合并两个文件,发生我的不在主要目标中。

以上是关于为啥我的 Swift 类的扩展在定义文件之外不可见?的主要内容,如果未能解决你的问题,请参考以下文章

为啥我不能在主函数之外定义一个类的对象(继承了另一个类)?

为啥将 Magento2 样本数据中的 Luma Thema 样本图像扩展到自定义主题时不可见?

为啥自定义 UIRefreshControl 类的背景颜色在 Swift 中没有改变?

Glade treeview liststore 数据不可见,无法想象为啥

如何为仅在测试中可见的结构创建 init 方法?

来自 Swift 的 CGRect 和 CGSize 扩展在 Objective-C 中不可见