Come funziona la covarianza per Optional
s in Swift?Come funziona la covarianza facoltativa in Swift
Dire scrivo il seguente codice:
var nativeOptionalView: Optional<UIView>
let button = UIButton()
nativeOptionalView = .Some(button)
var nativeOptionalButton = Optional.Some(button)
nativeOptionalView = nativeOptionalButton
Si compila e funziona bene. Tuttavia, se mi definisco MyOptional
come
enum MyOptional<T> {
case Some(T)
case None
}
e scrivere la seguente:
var myOptionalView: MyOptional<UIView>
let button = UIButton()
myOptionalView = .Some(button)
var myOptionalButton = MyOptional.Some(button)
myOptionalView = myOptionalButton
ottengo l'errore:
error: cannot assign value of type '
MyOptional<UIButton>
' to type 'MyOptional<UIView>
'
capisco perché questo errore accade con MyOptional
, quello che don' t capire è perché non succede con Optional
.
Sospetto che la risposta sia "magia del compilatore". – jtbandes
Avevo paura:/In tal caso, considerando che è open source, dov'è quella magia? – fpg1503
Non sicuro; il codebase è piuttosto grande. Punto di partenza: https://github.com/apple/swift/search?utf8=%E2%9C%93&q=optional+covariant – jtbandes