我正在研究一个框架。
该库是用Swift编写的,我注意到当一个类继承自NSObject
或符合NSObjectProtocol
时,可以在*.framework/Headers/*-Swift.h
中找到其声明。
该类在Objective-C代码的模块外部可用,因此它成为公共的。
如果访问级别是内部访问,为什么会发生这种情况?
答案 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 { }