2014-10-12 1 views
9

함수에 매개 변수로 인터페이스를 전달해야합니다. 인터페이스는 일반적으로 a.k.a.에는 연관된 유형이 있습니다. 나는 그것을 할 수있는 좋은 방법을 찾지 못했습니다.Swift에서 관련 유형 (일반 프로토콜)의 프로토콜을 매개 변수로 전달하는 방법은 무엇입니까?

protocol IObserver : class { 
    typealias DelegateT 
    ... 
} 

class Observer: IObserver { 
    typealias DelegateT = IGeneralEventsDelegate // IGeneralEventsDelegate is a protocol 
    ... 
} 

func notify(observer: IObserver) { ... } // here I need a type for observer param 

내가이 작동합니다 발견 : 여기 내 코드입니다

func notify<T: IObserver where T.DelegateT == IGeneralEventsDelegate>(observer: T) { ... } 

는하지만 너무 복잡 어서. 클래스 변수에이 param을 저장하려면이 함수로 인해 전체 클래스를 generic으로해야합니까?

저는 C++ 개발자이고 Swift 언어에 익숙하지 않습니다. 그러나 일은 너무 복잡하고 사용자가 친숙하지 않습니다 ... 아니면 너무 어리 석습니다.

+0

에 그랬던 것처럼 아마 당신은 명시 적 관련 유형을

  • 을 계획하지 내가 너무 너무 때마다 생각한다. 정말로 불편 함. C++의 관점에서, Swift의'프로토콜'은'개념 '처럼 보입니다. 그리고 '프로토콜'을 따르는 타입을 가진'확장자'는'concept_map'과 유사합니다. 이러한 기능은 컴파일 타임 다형성을 실현하는 데 유용합니다. 그러나 많은 경우에, 우리는'pure virtual class'와'multiple inheritance'와 같은 메커니즘을 원할 것입니다. 자바의'인터페이스 '에 해당하여 런타임 다형성을 구현합니다. 하지만 스위프트 제네릭 형식에 대한 이들에 해당하는 메커니즘이 없을 수도 있습니다 .. – findall

  • +0

    여기에 내 관련 답변보기 ---> http://stackoverflow.com/a/34995198/5389500 – eonist

    답변

    5

    프로토콜에 typealias을 사용하여 일반 형식으로 만들면 관련 유형이 해결 될 때까지 변수 유형으로 사용할 수 없습니다. 당신은 아마 경험으로, 관련 유형의 프로토콜을 사용하여 컴파일 오류 변수 (또는 함수 매개 변수) 결과를 정의 : 당신이 구체적인 형태로 사용할 수 없음을 의미

    Protocol 'MyProtocol' can only be used as a generic constraint because it has Self os associated type requirements

    합니다.

    그래서 유일한 2 가지 방법이 내가 구체적인 유형으로 관련된 유형의 프로토콜을 사용하는 알고있다은 다음과 같습니다

    • 간접적를 구현하는 클래스를 만들어. 당신이 당신의 FUNC

    도 참조 관련 대답 https://stackoverflow.com/a/26271483/148357

    관련 문제