2016-11-08 3 views
1

Xcode의 Swift 인터페이스에서 Objective-C 클래스의 싱글 톤 메서드 정의를 사용할 수없는 이유에 대한 문서를 찾고있었습니다.Objective C 스위프트 인터페이스에서 사용할 수없는 싱글 톤 메서드

목적-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()은 잘 처리되었습니다. 하나의 관련 관찰은 sharedAccessor()이 인터페이스의 일부가 아닌 경우 Type QPSSharedAccessor has no member sharedAccessor이라는이 오류가 발생하면 호출하려고 시도한다는 것입니다. 그러나의 목표 - 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합니다 (싱글 섹션 참조) 이러한 참조가 유용한

또한, 참조하시기 바랍니다.