我一直在寻找有关为什么Objective-C类中的单例方法定义在Xcode上的Swift接口上不可用的原因的文档。
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接口上,它的定义如下
/**
* 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是不可行的。有关解决此问题的建议?
答案 0 :(得分:0)
经过一些实验,我发现sharedAccessor()
似乎有一些特殊的含义。使用不同的名称,例如sharedAccessor1()
或sharedInstance()
,对我来说很好。一个相关的观察是,当它不是界面的一部分时尝试调用sharedAccessor()
会导致此错误: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中编写包装器方法,并通过桥接头将其提供给Swift。例如:
QPSSharedAccessor * getGlobalQPSSharedAccessor()
{
return [QPSSharedAccessor sharedAccessor];
}
您还可以使用具有不同名称并委派给QPSSharedAccessor
的方法向sharedAccessor()
添加类别。
另外,请查看这些引用是否有用:
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(参见Singleton部分)。