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>'
무슨 일이 벌어지고 있으며, 해결 방법은 무엇입니까? 확실히 몇 가지 해결 방법이 있어야합니다 ...
'Generic'을'Generic '으로 변환해야하는 이유는 무엇입니까? '(String) -> Void'는''(Any) -> Void'로 변환 할 수 없습니다. 사용자 정의 제네릭 형식은 공분산을 지원하지 않습니다. https://en.wikipedia.org/wiki/Covariance_and_contravariance_(computer_science) –
jtbandes
그러나'String is Any' ... 함수가'Any'를 가져다가'String'을 주면 불평하지 않을 것입니다 –
' String'은'Any'이며,'(String) -> Void'는'(Any) -> Void'가 아닙니다. 내 요점은 이것이 항상 * 일할 것으로 추측 할 수 없다는 것입니다. 일부 언어에서는 작동해야한다고 지정할 수 있습니다. 스위프트의 현재 버전은 그 중 하나가 아닙니다. – jtbandes