我一直在寻找为什么Xcode的Swift接口上没有Objective-C类中的单例方法定义的原因的文档。

这样定义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都不可行。有关解决此问题的建议?

最佳答案

经过一些试验,我发现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(请参阅“单例”部分)。

10-08 05:48