W jaki sposób kowariancja działa dla Swift w sieciach Optional
?Jak działa opcjonalna kowariancja w Swift
Say I napisać następujący kod:
var nativeOptionalView: Optional<UIView>
let button = UIButton()
nativeOptionalView = .Some(button)
var nativeOptionalButton = Optional.Some(button)
nativeOptionalView = nativeOptionalButton
kompiluje i działa dobrze. Jednak gdybym określić MyOptional
jak
enum MyOptional<T> {
case Some(T)
case None
}
I napisać następujące:
var myOptionalView: MyOptional<UIView>
let button = UIButton()
myOptionalView = .Some(button)
var myOptionalButton = MyOptional.Some(button)
myOptionalView = myOptionalButton
pojawia się błąd:
error: cannot assign value of type '
MyOptional<UIButton>
' to type 'MyOptional<UIView>
'
rozumiem dlaczego to błędy dzieje z MyOptional
, co I don” Rozumiemy, dlaczego tak się nie stało z Optional
.
Podejrzewam, że odpowiedź brzmi "magia kompilatora". – jtbandes
Bałem się tak:/w takim przypadku, biorąc pod uwagę, że jest to open source, gdzie jest ta magia? – fpg1503
Nie jestem pewien; kod jest dość duży. Punkt początkowy: https://github.com/apple/swift/search?utf8=%E2%9C%93&q=optymatywny+covariant – jtbandes