2016-05-20 46 views
11

Eşanlamlılık Swift'de Optional s için nasıl çalışır?İsteğe bağlı eşanlamlılık Swift'de nasıl çalışır?

var nativeOptionalView: Optional<UIView> 
let button = UIButton() 
nativeOptionalView = .Some(button) 
var nativeOptionalButton = Optional.Some(button) 

nativeOptionalView = nativeOptionalButton 

hazırlar ve gayet güzel çalışıyor:

Aşağıdaki kodu yazmak Say. Aşağıdaki

enum MyOptional<T> { 
    case Some(T) 
    case None 
} 

olarak MyOptional tanımlamak Ve yazma Ancak eğer: 'Bu hatalar MyOptional ile bunun neden ben don anlamak

error: cannot assign value of type ' MyOptional<UIButton> ' to type ' MyOptional<UIView> '

:

var myOptionalView: MyOptional<UIView> 
let button = UIButton() 
myOptionalView = .Some(button) 
var myOptionalButton = MyOptional.Some(button) 

myOptionalView = myOptionalButton 

hatası alıyorum Anlamak, neden Optional ile olmuyor.

+2

Yanıtın "derleyici büyüsü" olduğundan şüpheliyim. – jtbandes

+2

Korktum:/Bu durumda, açık kaynak olarak düşünülürse, bu sihir nerede? – fpg1503

+0

Emin değilim; Kod tabanı oldukça büyük. Başlangıç ​​noktası: https://github.com/apple/swift/search?utf8=%E2%9C%93&q=optional+covariant – jtbandes

cevap

3

Gelmez. Swift şimdilik özel kovaryant jenerikleri desteklemiyor.

Hızlı tip denetleyici, ifade değil, genel (Haskell'deki gibi). Bu görev lib/Sema'da handled by Semantik Analizi'dir. Kısıtlama sistemi daha sonra match the types çalışır ve özel kovaryans durumları collections ve optionals için işlenir.

Bu bir dil tasarım kararıydı. Yerleşik koleksiyon türleri ve isteğe bağlı seçenekler ile ihtiyacınız olan her şeyi yapabilmeniz gerekir. Eğer değilse muhtemelen bir radar açmalısınız.

0

Muhtemelen bazı "derleyici sihirbazı" nın devam ettiğini kabul etmekteyken, bu, düğmeyi bir UIView'e, örn.

var myOptionalButton = MyOptional.Some(button as UIView) 

veya

var myOptionalButton: MyOptional<UIView> = .Some(button)