@nickfalk находится на правильном пути, но мы можем сделать лучше. Его результат, к сожалению, возвращает [AnyObject]
, который вы не можете затем позвонить newFile
с (я предполагаю). Но это нормально, мы можем доиграть до конца Легко.
Что вы хотите, это частичная карта. То есть вы хотите сопоставить некоторые (но, возможно, не все) элементы одного lis t в другой список (от AnyObject
до File
, если можно). Поэтому должно быть какое-то правило для выбора, а также некоторое правило для сопоставления. Необязательно, давайте объединим их. Назовем функцию, которая делает это f
. Тогда его тип:
f: T->U?
Так что есть какая-то магия функция, которая, возможно, преобразовать T
в U
. Мы хотим с этим сопоставить. Звучит просто:
extension Array {
func partialMap<U>(f: T->U?) -> [U] {
var result = [U]()
for x in self {
if let u = f(x) {
result.append(u)
}
}
return result
}
}
Так что теперь мы скрыли все гадкое мутации и var
и этажерки глубоко, где мы не должны смотреть на него. У нас есть функция, которая принимает функцию отображения из «что-то» в «возможно что-то другое» и возвращает список «что-то, что мы могли бы отобразить».
Теперь все красиво и неизменны и многоразовые:
let result = array.partialMap { ($0 as? NSDictionary).map(newFile) }
Вау там. Что это такое map
посередине? Хорошо, as?
возвращает NSDictionary?
.Если у вас map
необязательный, то, если необязательно None
, он возвращает None
, в противном случае он применяет функцию к значению и обертывает ее в Some
. Так что все это занимает AnyObject
и возвращает File?
так, как мы и хотели. Один partialMap
позже у нас есть наш ответ.
За что? сделать его короче? ваш код ясен и читаем. Не делайте жизнь сложнее для другого разработчика после того, как вы попытаетесь понять свою логику :) –
Если этот массив представляет собой массив словарей, зачем вам это нужно, если его вообще разрешить? –
Что вы пытаетесь проверить? Какой тип 'array'? –