gpt4 book ai didi

ios - Objective C Singleton 方法在 Swift 接口(interface)中不可用

转载 作者:行者123 更新时间:2023-11-28 06:30:29 26 4
gpt4 key购买 nike

我一直在寻找有关 Objective-C 类中单例方法定义在 Xcode 上的 Swift 接口(interface)上不可用的原因的文档。

Objective-C类是这样定义的

/**
* A general accessor across the sample App to remove the dependency of QPSLibraryManager from resusable components.
*/
@interface QPSSharedAccessor : NSObject

/**
* Required by QPSLibraryManager and some UI components.
*/
@property (nonatomic, strong) QPSApplicationConfiguration *qpsConfiguration;

/**
* Provides Commands to app
*/
@property (nonatomic, strong) id<QPSAppController> appController;;

/**
* Shared singleton.
*/
+ (instancetype)sharedAccessor;

/**
* Returns access to a configuration manager
*/
- (QPSConfigurationManager *)configurationManager;

@end

在 Swift 接口(interface)上,它是这样定义的

/**
* A general accessor across the sample App to remove the dependency of QPSLibraryManager from resusable components.
*/
open class QPSSharedAccessor : NSObject {


/**
* Required by QPSLibraryManager and some UI components.
*/
open var qpsConfiguration: QPSApplicationConfiguration!


/**
* Provides Commands to app
*/
open var appController: QPSAppController!


/**
* Returns access to a configuration manager
*/
open func configurationManager() -> QPSConfigurationManager!
}

我希望在 Swift 上看到 sharedAccessor() 单例方法,但如您所见,它缺失了。在单独的 swift 文件上调用上述方法会导致编译器错误,提示 sharedAccessor() 方法不存在。顺便说一句,将所有内容都转换为 Swift 是不可行的。有关解决此问题的建议?

最佳答案

经过一些实验,我发现 sharedAccessor() 似乎有一些特殊的含义。使用不同的名称,例如sharedAccessor1()sharedInstance(),对我来说效果很好。一项相关的观察是,当 sharedAccessor() 不是接口(interface)的一部分时尝试调用它会导致此错误:Type QPSSharedAccessor has no member sharedAccessor,这是有道理的。但是,将 sharedAccessor() 添加到 Objective-C 代码会导致:

'sharedAccessor()' is unavailable: use object construction 'QPSSharedAccessor()'

打开错误详细信息可以更清楚地了解这一点:

'sharedAccessor()' has been explicitly marked unavailable here (__ObjC.QPSSharedAccessor)

现在,将 QPSSharedAccessor 类型重命名为其他名称使 sharedAccessor() 可以接受,但是如果新类型名称是,例如 QPSMyClass,那么命名方法myClass()就成了问题!

要解决这个奇怪的问题,显然与编译器内部结构、晦涩的方法命名约定或错误有关,您只需将 sharedAccessor() 方法重命名为其他名称即可。或者,您可以用 C 或 Objective-C 编写包装器方法,并通过桥接 header 使其对 Swift 可用。例如:

QPSSharedAccessor * getGlobalQPSSharedAccessor()
{
return [QPSSharedAccessor sharedAccessor];
}

您还可以使用具有不同名称并委托(delegate)给 sharedAccessor() 的方法将类别添加到 QPSSharedAccessor

此外,请查看这些引用资料是否有用:

Can't build in Xcode with error "[method] has been explicitly marked unavailable"

https://developer.apple.com/library/content/documentation/Swift/Conceptual/BuildingCocoaApps/AdoptingCocoaDesignPatterns.html (参见单例部分)。

关于ios - Objective C Singleton 方法在 Swift 接口(interface)中不可用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40489661/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com