Swift接口中没有目标C Singleton方法



我一直在寻找文档,解释为什么Objective-C类中的singleton方法定义在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((singleton方法,但正如您所看到的,它是缺失的。在单独的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];
}

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

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

可以';t内建有错误的Xcode";[方法]已被明确标记为不可用";

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

最新更新