Swift [1,2] соответствует AnyObject, но [Enum.a, Enum.b] не

Я в AppDelegate, пытаясь передать ответ на запрос расширения WatchKit. Я не могу использовать массив перечислений как значение в словаре, значения которого набираются как AnyObject. Экспериментирование на игровой площадке показывает это:

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

Конечно, я могу обойти это, преобразовывая свои перечисления в строки или числа, но почему это ошибка типа в Swift?

Ответ 1

AnyObject существует для совместимости с Objective-C. Вы можете помещать объекты только в массив [AnyObject], который может интерпретировать Objective-C. Swift перечисления не совместимы с Objective-C, поэтому вам нужно преобразовать их в нечто, что есть.

var x: AnyObject = [0, 1] работает, потому что Swift автоматически обрабатывает перевод Int в тип NSNumber, который может обрабатывать Objective-C. К сожалению, такого автоматического преобразования для Swift нет, поэтому вам нужно сделать что-то вроде:

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

Это предполагает, что ваш перечисление имеет базовый тип, который Objective-C может обрабатывать, например String или Int.

Другой пример того, что не работает, является необязательным.

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

Подробнее см. Работа с Cocoa Типы данных.