2016-11-08 50 views
1

我一直在寻找为什么Objective-C类中的singleton方法定义在Xcode的Swift接口上不可用的原因的文档。Objective C Singleton方法不适用于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 

在夫特接口,其像这样

/** 
* 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! 
} 

定义我期望看到的sharedAccessor()单方法上夫特但正如你所看到的那样,它缺失了。在单独的swift文件中调用该方法会导致编译器错误,并说sharedAccessor()方法不存在。把所有东西都转换成Swift是不可行的。建议解决这个问题?

回答

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(见单身节)。

相关问题