2017-01-07 1 views
1

난 당황해 ... 컴파일러가 어떻게 될지 생각조차 모르겠지만 90 % 확신합니다. 가능해야합니다 :'Generic <String>'유형의 값을 예상 인수 유형 'Generic <Any>'으로 변환 할 수 없음

class Generic<Type: Any> { 

} 

protocol Foo { 
    func bar(_ baz: Generic<Any>) 
} 

class SomeFoo: Foo { 
    func bar(_ baz: Generic<Any>) { 
     print("Got", baz) 
    } 
} 

let someFoo = SomeFoo() 
let generic = Generic<String>() 

someFoo.bar(generic) // Compile error: Cannot convert value of type 'Generic<String>' to expected argument type 'Generic<Any>' 

무슨 일이 벌어지고 있으며, 해결 방법은 무엇입니까? 확실히 몇 가지 해결 방법이 있어야합니다 ...

+2

'Generic '을'Generic '으로 변환해야하는 이유는 무엇입니까? '(String) -> Void'는''(Any) -> Void'로 변환 할 수 없습니다. 사용자 정의 제네릭 형식은 공분산을 지원하지 않습니다. https://en.wikipedia.org/wiki/Covariance_and_contravariance_(computer_science) – jtbandes

+0

그러나'String is Any' ... 함수가'Any'를 가져다가'String'을 주면 불평하지 않을 것입니다 –

+1

' String'은'Any'이며,'(String) -> Void'는'(Any) -> Void'가 아닙니다. 내 요점은 이것이 항상 * 일할 것으로 추측 할 수 없다는 것입니다. 일부 언어에서는 작동해야한다고 지정할 수 있습니다. 스위프트의 현재 버전은 그 중 하나가 아닙니다. – jtbandes

답변

1

이것은 공분산이라고하며 Swift의 사용자 유형에는 지원되지 않습니다 (내가 아는 어레이 제외). BTW Objective-C generics는 어떤 식 으로든 공분산을 지원합니다. 나는 2 개 옵션 중에서 상황에서
를 선택할 것 :

  1. 푸 기능에 의해 허용됩니다 제네릭이 아닌 프로토콜을 만들고 Generic 클래스에서이 프로토콜을 구현하는 일반적인 메이크업 표시 줄 기능
관련 문제