【问题标题】: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() {}
}

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

【问题讨论】:

    标签: ios swift visibility nsmanagedobject


    【解决方案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 调用扩展程序中的一个函数后,错误消失在其他使用函数的地方 - 我现在可以从任何地方访问它们。
    • 这是一个非常有用的解决方案。对我来说,这个问题是通过解决版本控制系统中的冲突产生的。合并两个文件,发生我的不在主要目标中。
    猜你喜欢
    • 2021-10-05
    • 1970-01-01
    • 1970-01-01
    • 2019-03-05
    • 2014-09-03
    • 2021-12-28
    • 1970-01-01
    • 1970-01-01
    • 2015-07-25
    相关资源
    最近更新 更多