2015-04-21 13 views
10

Jestem w AppDelegate, próbuję przekazać odpowiedź na żądanie rozszerzenia WatchKit. Nie mogę użyć tablicy wyliczeń jako wartości w Słowniku, którego wartości są wpisane jako AnyObject. Eksperymentowanie w boisko pokazuje to:Swift [1,2] jest zgodny z AnyObject, ale [Enum.a, Enum.b] nie jest

enum E : Int { 
    case a = 0 
    case b 
} 
var x : AnyObject = [0, 1] // OK 
var y : AnyObject = [E.a, E.b] // [E] is not convertible to AnyObject 

Oczywiście mogę obejść ten problem poprzez przekształcenie moje teksty stałe ciągi znaków lub liczb, ale dlaczego jest to błąd typu w Swift?

Odpowiedz

24

AnyObject istnieje dla kompatybilności z Objective-C. Obiekty można umieszczać tylko w tablicy [AnyObject], którą Objective-C może zinterpretować. Swift enums nie są kompatybilne z Objective-C, więc musisz przekonwertować je na coś, co jest.

var x: AnyObject = [0, 1] prace ponieważ Swift automatycznie obsługuje translację Int do rodzaju NSNumber który może obsłużyć Objective-C. Niestety, nie ma takiej automatycznej konwersji teksty stałe Swift, więc pozostało do zrobienia czegoś takiego:

var y: AnyObject = [E.a.rawValue, E.b.rawValue] 

ta zakłada, że ​​enum ma podstawowy typ że Objective-C może obsłużyć, jak String lub Int.

Innym przykładem czegoś, co nie działa, jest opcjonalne.

var a: Int? = 17 
var b: AnyObject = [a] // '[Int?]' is not convertible to 'AnyObject' 

Aby uzyskać więcej informacji, zobacz Working with Cocoa Data Types.

+1

Ah, wiesz, że myliłem AnyObject z dowolnym. Ups! –

Powiązane problemy