2014-12-03 3 views
2

에서 일반적인 기능을 제약 : 지금까지은 또한 I는 스위프트 프로토콜은 다음과 같이 정의한 스위프트 프로토콜

class MyBaseClass : MyProtocol { 
    func genericMethod<T where T:MyProtocol>(param:T) ->() { 
     println("Performing generic method for type \(T.self)") 
    } 
} 

class MySubClass : MyBaseClass { 
    ... 
} 

:

protocol MyProtocol { 
    func genericMethod<T:MyProtocol>(param:T) ->() 
} 

나는이 같은 기본 클래스의 일반적인 방법을 구현할 수 있습니다 , 너무 좋아. 이 메서드를 구현할 수 및 컴파일 및 잘 실행됩니다.

이제는 비슷한 것을하고 싶습니다. 기본 클래스에서 Comparable과 같은 프로토콜을 준수하도록 요구함으로써 일반 메서드의 유형을 더욱 제한하고 싶습니다. I 형 T에 추가적인 제약 조건을 추가하면, MyClass 컴파일되지 않습니다 클래스가 더 이상 프로토콜을 준수하지 않기 때문에

class MyBaseClass : MyProtocol { 
    func genericMethod<T where T:MyProtocol, T:Comparable>(param:T) ->() { 
     println("Performing generic method for type \(T.self)") 
    } 
} 

:이 시도.

제네릭 형식에 대한 추가 제약 조건을 추가하여 프로토콜 준수를 중단해서는 안됩니다. 내가 뭘 놓치고 있니? 그 프로토콜은 이 MyProtocol을 따르는 유형의 매개 변수를 전달해야한다고 말하고 있습니다. MyProtocol의 한 가능한 구현 - - 나는 MyBaseClass에서이를 구현하기 위해 갈 때 나는 매개 변수가 미스트MyProtocol

에 추가 Comparable을 준수한다는 의해 더욱 그 구현을 제한 할 수 있어야한다고를하는 방법에 있는가 여기에서하려고하는 것처럼 기본 구현에서 제네릭 형식을 수정 하시겠습니까? 제네릭 형식은 프로토콜이 준수를 보장하도록되어 있기 때문에 프로토콜에 부합 중단하고, 적합성이 Comparable이 아닌 하위 유형을 보장 할 수 없습니다 원인 해야에 추가적인 제약 조건을 추가

+1

나는 당신이 놀란 이유를 모르겠다. 아마도 나는 명백한 것을 잃어 버렸지 만, 프로토콜이 "나를 채택하는 사람은 매개 변수가 자신의 유형 인 genericMethod를 구현해야한다."하지만 T : MyBaseClass, T : Comparable는 MyBaseClass 자체 유형이 아닙니다. 왜냐하면 MyBaseClass는 Comparable을 채택하지 않기 때문에 컴파일러가 말한 것처럼 당신은 프로토콜에 의해 정의 된 계약을 위반했습니다. – matt

+0

프로토콜에서 '자체'참조를 사용하면 문제를 증명하는 한 가지 방법 일뿐입니다. 문제가 하나의 프로토콜을 사용하고 다른 프로토콜을 사용하는 경우이 동작에 놀라는 이유를 명확히하기 위해 질문을 업데이트합니다. –

+0

수정을 주셔서 감사합니다. 음, 컴파일러가 마음에 들지 않는 이유에 대한 대답 func genericMethod (param : T) ->()'는 func genericMethod (와)과 일치하지 않는다. param : T) ->()'.당신은 일종의 정신적 정당화 각주에서 "하나는 다른 하나의보다 제한된 버전"이라고 말하고 있지만 컴파일러에게는 아무런 문제가되지 않습니다. 요점은 하나가 다른 하나가 아니라는 것입니다. – matt

답변

2

. MyProtocol 오브젝트가 모두 Comparable을 따르도록하려면 MyProtocol 정의의 일부로 만들어야합니다.

protocol MyProtocol: Comparable { 
    //... 
} 

나는이 시도하지 않은,하지만 당신은 MyBaseClassComparable 유형을 만들 경우에도 작동 할 수 있습니다.

+0

모든 MyProtocol 객체가 Comparable을 따르는 것을 원하지 않습니다. MyBaseClass의 모든 서브 클래스가'genericFunction' 메소드를 상속 받기를 원합니다.이 메소드는 특정 서브 클래스도'Comparable'을 준수한다는 지식으로 구현됩니다. 필자는 프로토콜을 다르게 구현하는 다른 'MyProtocol' 기본 클래스를 가질 것입니다. 반드시 하위 클래스가'Comparable'을 따르는 가정에 의존하지 않아도됩니다. –

+0

그런 다음 MyBaseClass가 Comparable을 준수하도록 지정해야합니다. 그렇게하면 코드가 컴파일됩니까? –

0

한 가지 해결 방법은 프로토콜의 버전을 가장 많이 사용하는 으로 정의하는 것입니다. 이 컴파일됩니다 :

+1

complier 버그와 같은 느낌입니다. –