2016-07-26 4 views
1

나는이 같은 목표 - C에 정의 된 프로토콜 요구 사항을 충족해야합니다. 다른 Object 클래스의 Set을 반환하고 싶습니다. 내가 반환 할 클래스는 다음과 같이 정의된다 :Swift에서 NSSet <Class>을 사용하는 방법 (세트 <NSObject>로 내 보내기)?</p> <pre><code>@protocol AProtocol <NSObject> + (NSSet<Class> * _Nullable)someClasses; @end </code></pre> <p>내가 스위프트로 작성된 서브 클래스에서이 프로토콜을 구현하려는 :

프로토콜을 준수하는 클래스는 다음과 같이 정의된다

class B: NSObject {} 
:

class A: NSObject, AProtocol { 
    static func someClasses() -> Set<NSObject>? { 
     return [B.self] 
    } 
} 

NSSet<Class>Set<NSObject> 대신 설정에 다리입니까?

이 솔루션은 충돌합니다. 어떻게 문제를 해결할 수 있습니까? AnyClassSetValueType의 전제 조건이다 Hashable을 준수하지 않기 때문에

+0

한 가지 질문으로,'Set ? '을 반환하는 것이 프로토콜에서 NSSet 반환 유형을 어떻게 충족시키는 지 알 수 없습니다. 'Set '이 (가) 아니어야합니까? 또한 AppDelegate 유형에 대한 선언을 포함하십시오. –

+0

@PatrickGoley 예, 혼란을 완전히 이해합니다. 혼란 스럽습니다. 누군가 나에게 설명했듯이 클래스는 Objective-C의 객체 일뿐입니다. 이것이 바로 이와 같이 연결되어있는 이유입니다. 다른 경우에는 AnyClass에 브리징한다고 생각하지만 AnyClass는 불가능한 Hashable (Set의 전제 조건)을 따르지 않기 때문에 가능하지 않습니다. Xcode는 이와 같은 프로토콜을위한 인터페이스를 생성합니다. AppDelegate는 Xcode에 의해 생성 된 것입니다. 원래 게시물에 추가합니다. – Ben

+0

자, 문제 자체가 해결되고, 질문을 편집하고 답변을 추가합니다. 어쩌면 다른 사람들에게 도움이 될 것입니다. – Ben

답변

0

NSSet<Class>Set<NSObject>에 브리지됩니다.

그것은 NSObjectProtocol에 대해 다음 확장자로 해결할 수 있습니다

extension NSObjectProtocol where Self: NSObject { 
    static var objcClass: NSObject { 
     return (self as AnyObject) as! NSObject 
    } 
} 

이것은 NSObject로 주조 객체의 클래스를 반환합니다. Swift의 유형 시스템이 너무 강하기 때문에 유형을 인스턴스 유형으로 직접 유형 변환 할 때 컴파일하거나 경고하지 않기 때문에 먼저 AnyObject으로 변환해야합니다. Objective-C에서는 Class이 단지 객체이기 때문에 괜찮습니다. NSObject이 Objective-C에 구현되어 있고 확장자가 NSObjectProtocol 일 뿐이므로 강제 저장과 함께 사용하면 저장됩니다. NSObjectProtocol에 확장을 구현하고 NSObject 자체에 확장을 적용하면 Objective-C에 내 보내지 않는다는 긍정적 인 효과가 있습니다.