为啥我的 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 中隐藏定义和实现细节(对于var
s 广告方法),就像在 Objective-C 中通过仅将内容放在 .m 文件中一样?谢谢。
@Unheilig Swift 具有基于文件和模块的访问控制,带有 public
、internal
和 private
修饰符,这是一种与头文件非常不同的方法。你可以在Swift Language book阅读更多内容。
@NateCook 对;我记得在发布问题后。我太累了,我问。非常感谢您的回复。【参考方案2】:
听起来您的新文件 (SomeClassExtension.swift) 没有包含在正确的目标中。通过在 Xcode 中选择文件,然后打开“文件检查器”(查看菜单 > 实用程序 > 显示文件检查器)来仔细检查文件的目标成员资格。确保在 Target Membership 标题下检查了正确的目标。
【讨论】:
我最终取消选中目标并重新检查它。这为我解决了问题。 有人找出问题所在吗? 我遇到了同样的错误,但是我的应用程序编译时发现错误,因为它在编译过程中消失了。非常奇怪和烦人(Xcode 7.1.1)。 奇怪;必须是索引问题;从 AppDelegate 调用扩展程序中的一个函数后,错误消失在其他使用函数的地方 - 我现在可以从任何地方访问它们。 这是一个非常有用的解决方案。对我来说,这个问题是通过解决版本控制系统中的冲突产生的。合并两个文件,发生我的不在主要目标中。以上是关于为啥我的 Swift 类的扩展在定义文件之外不可见?的主要内容,如果未能解决你的问题,请参考以下文章
为啥将 Magento2 样本数据中的 Luma Thema 样本图像扩展到自定义主题时不可见?
为啥自定义 UIRefreshControl 类的背景颜色在 Swift 中没有改变?