에서 일반적인 기능을 제약 : 지금까지은 또한 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
이 아닌 하위 유형을 보장 할 수 없습니다 원인 해야에 추가적인 제약 조건을 추가
나는 당신이 놀란 이유를 모르겠다. 아마도 나는 명백한 것을 잃어 버렸지 만, 프로토콜이 "나를 채택하는 사람은 매개 변수가 자신의 유형 인 genericMethod를 구현해야한다."하지만 T : MyBaseClass, T : Comparable는 MyBaseClass 자체 유형이 아닙니다. 왜냐하면 MyBaseClass는 Comparable을 채택하지 않기 때문에 컴파일러가 말한 것처럼 당신은 프로토콜에 의해 정의 된 계약을 위반했습니다. – matt
프로토콜에서 '자체'참조를 사용하면 문제를 증명하는 한 가지 방법 일뿐입니다. 문제가 하나의 프로토콜을 사용하고 다른 프로토콜을 사용하는 경우이 동작에 놀라는 이유를 명확히하기 위해 질문을 업데이트합니다. –
수정을 주셔서 감사합니다. 음, 컴파일러가 마음에 들지 않는 이유에 대한 대답 func genericMethod (param : T) ->()'는 func genericMethod (와)과 일치하지 않는다. param : T) ->()'.당신은 일종의 정신적 정당화 각주에서 "하나는 다른 하나의보다 제한된 버전"이라고 말하고 있지만 컴파일러에게는 아무런 문제가되지 않습니다. 요점은 하나가 다른 하나가 아니라는 것입니다. –
matt