Общая итерация между коллекциями

Итак, у меня есть либо словарь, либо массив, и вместо того, чтобы проверять null для любого из них, а затем перечислять их отдельно, используя свою собственную логику, я пытаюсь найти общее решение, которое независимо от типа коллекции выполняет итерацию по своим элементам, что-то вроде получения их перечислителя и просто делаю for(index,element) in enumerator, но компилятор продолжает кричать. Я пробовал разные способы, и мне не повезло, я, похоже, не могу привести ни к типу стерты AnyCollection<AnyObject> Я знаю, что вопрос немного расплывчатый, но это, вероятно, потому, что я все еще пытаюсь понять тип стирание и использование оберток Any(type)

Изменить: запрос на добавление попыток, но он не компилируется, как я сказал, у меня проблемы с общими протоколами.

var a = AnyCollection(array!)
var d = AnyCollection(dictionary!)

let enumerator = a == nil ? d.enumerated(): a.enumerated()//compile error

for(index,element) in enumerator {

}

Сообщение об ошибке:

Значения результата в '? :' выражение имеет несоответствующие типы 'EnumeratedSequence‹AnyCollection‹(ключ: String, значение: AnyObject)››' и 'EnumeratedSequence‹AnyCollection‹AnyObject››'


person Genhain    schedule 25.11.2016    source источник
comment
Можете ли вы добавить какой-либо код из ваших неудачных попыток?   -  person user28434'mstep    schedule 25.11.2016
comment
@ user28434 обновлено, и ошибка компиляции: значения результата в '? :' выражение имеет несоответствующие типы 'EnumeratedSequence‹AnyCollection‹(ключ: String, значение: AnyObject)››' и 'EnumeratedSequence‹AnyCollection‹AnyObject››'   -  person Genhain    schedule 25.11.2016
comment
Чего именно вы пытаетесь достичь, делая это? Поскольку они имеют разные типы элементов (AnyObject против (key: String, value: AnyObject)) — даже если вы заставите это работать, вам придется выполнить некоторое беспорядочное приведение типов в вашем цикле, чтобы сделать что-нибудь полезное с элементами.   -  person Hamish    schedule 27.11.2016


Ответы (1)


Есть две проблемы:

  1. AnyCollection не может быть nil

    var a = AnyCollection(array!)
    let a = nil -> Nil cannot be assigned to type 'AnyCollection<AnyObject>'
    

    Это легко исправить. a.first может быть nil.

ресурс: API AnyCollection

  1. #P5# <блочная цитата> #P6#
    let array = [AnyObject]()
    let dictionary = [String : Any]()
    
    var a = AnyCollection(array)
    var d = AnyCollection(dictionary)
    
    let enumerator = a.first == nil ? d.enumerated() : a.enumerated() -> compile error
    let enumerator = a.first == nil ? a.enumerated() : a.enumerated() -> works but useless
    

Чтобы решить обе проблемы, вы должны использовать:

if a.first == nil {
    let enumOne = d.enumerated()
} else {
    let enumOne = a.enumerated()
}
person Idan    schedule 25.11.2016
comment
Спасибо за ввод, но это не ответ, я ищу ваш оператор if else, который по-прежнему разделяет логику перечисления словаря и массива, я хочу, чтобы ему было все равно, какой тип коллекции или перечисления (если возможно), поэтому у меня есть только один для цикла - person Genhain; 25.11.2016
comment
Я не думаю, что вы можете изменить тип переменной после того, как вы ее объявили. - person Idan; 25.11.2016