我工作的一个框架。
该库是用斯威夫特和我注意到,当一个类继承NSObject
或符合NSObjectProtocol
,它的声明可以在*.framework/Headers/*-Swift.h
找到。
这个类是Objective-C代码的模块外可用,所以它成了公众。
它为什么会发生,如果访问级别是内部?
内部斯威夫特类需要提供给该框架的Objective-C代码,但唯一的办法Objective-C代码可以访问雨燕类是通过导入-Swift.h
头文件。
现在,斯威夫特类怎么能是Objective-C中可见:它要么需要继承NSObject
,或符合NSObjectProtocol
。如果有任何这两个条件被满足,并且类声明不被饰以@nonobjc
/ private
/ fileprivate
,那么它将被经由-Swift.h
模块头出口到目的-C。
这就是为什么任何夫特类是可导出到目标C会自动出现在所讨论的头文件中。这是一个(不幸的),巧合的是,对于框架这导致类是公开可用的(由于这样的事实,即出现在头部任何Objective-C的声明是公共的)。
现在,如果你希望你的类没有在-Swift.h
头文件结束了,但仍然要保持NSObject(Protocol)
继承/一致性,解决方法是使你的类通用,从而禁止其接触到的Objective-C。注意,这也将防止从类在同一个框架内提供给Objective-C代码。
// the generic argument doesn't matter, it's only used to make the class
// Swift-only
class MyClass<T>: NSObject { }
需要说明的是,每一个使用类的时候,你需要指定为通用参数的值。这可以通过添加一个中间基类来避免:
// just a class that inherits NSObject, but is not exported in the -Swift header
class Empty<T>: NSObject { }
class MyClass: Empty<String> { }