为什么,如果你从NSObject的斯威夫特继承一个类成为市民?

问题描述 投票:1回答:1

我工作的一个框架。

该库是用斯威夫特和我注意到,当一个类继承NSObject或符合NSObjectProtocol,它的声明可以在*.framework/Headers/*-Swift.h找到。

这个类是Objective-C代码的模块外可用,所以它成了公众。

它为什么会发生,如果访问级别是内部?

objective-c swift module nsobject nsobjectprotocol
1个回答
0
投票

内部斯威夫特类需要提供给该框架的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> { }
最新问题
© www.soinside.com 2019 - 2025. All rights reserved.