2016-11-08 6 views
1

XcodeのSwiftインターフェイスでObjective-Cクラスのシングルトンメソッド定義が使用できない理由のドキュメントを探していました。目的CシングルトンメソッドがSwiftインターフェイスで利用できない

Objective-Cのクラスは、その私はスウィフトのsharedAccessor()シングルトンメソッドを参照してくださいすることが期待しています。この

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

のように定義され、スウィフトインターフェイスのこの

/** 
* 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ファイルで上記のメソッドを呼び出すと、sharedAccessor()メソッドが存在しないというコンパイラエラーが発生します。すべてをスウィフトに変換することは実用的ではありません。この問題の修正に関するアドバイス?

答えて

0

いくつかの実験の後、私はsharedAccessor()がいくつかの特別な意味を持つように見えます。それには別の名前を使用します(例: sharedAccessor1()またはsharedInstance()、私のためにうまく働いた。関連する1つの観察は、sharedAccessor()がインターフェイスに含まれていないときにこのエラーが発生すると、Type QPSSharedAccessor has no member sharedAccessorを呼び出すと意味があります。しかし、中にObjective-Cのコードの結果にsharedAccessor()を追加:

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

は、エラーの詳細を開くには、この上でより多くの光を当てる:

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

を今、他のsharedAccessor()が許容可能なものにQPSSharedAccessorタイプの名前を変更し、新しいタイプ名がたとえばQPSMyClassの場合は、myClass()という名前のメソッドが問題になります。

この奇妙な問題を回避するには、明らかにコンパイラの内部、あいまいなメソッド命名規則、またはバグを解決するために、sharedAccessor()メソッドの名前を変更するだけです。また、CまたはObjective-Cでラッパーメソッドを記述し、ブリッジヘッダー経由でSwiftに使用できるようにすることもできます。たとえば:

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

また、方法別の名前を持つと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を(シングルトンのセクションを参照してください)。

関連する問題