如果您从Swift中的NSObject继承,则为什么类变为公共类?

时间:2019-01-25 22:15:05

标签: objective-c swift module nsobject nsobjectprotocol

我正在研究一个框架。

该库是用Swift编写的,我注意到当一个类继承自NSObject或符合NSObjectProtocol时,可以在*.framework/Headers/*-Swift.h中找到其声明。

该类在Objective-C代码的模块外部可用,因此它成为公共的。

如果访问级别是内部访问,为什么会发生这种情况?

1 个答案:

答案 0 :(得分:0)

该框架的Objective-C代码必须可以使用内部Swift类,但是,Objective-C代码访问Swift类的唯一方法是导入-Swift.h头文件。

现在,Swift类如何对Objective-C可见:它要么继承NSObject,要么遵循NSObjectProtocol。如果满足这两个条件中的任何一个,并且类声明未用@nonobjc / private / fileprivate装饰,那么它将通过{{1}导出到Objective-C。 }模块标题。

这就是为什么任何可导出到Objective-C的Swift类都会自动出现在讨论的头文件中的原因。不幸的是,对于框架而言,这导致该类是公开可用的(由于出现在标题中的所有Objective-C声明都是公共的)。

现在,如果您不希望类最终出现在-Swift.h头文件中,但仍然希望保留-Swift.h继承/一致性,则一种解决方法是使您的类具有通用性,因此禁止将其暴露于Objective-C。请注意,这还将防止该类可用于同一框架中的Objective-C代码。

NSObject(Protocol)

需要注意的是,每次使用该类时,都需要为泛型参数指定一个值。可以通过添加中间基类来避免这种情况:

// the generic argument doesn't matter, it's only used to make the class
// Swift-only
class MyClass<T>: NSObject { }