Конкатенация массива к другому массиву необязательных значений с помощью оператора "+="
У меня есть массив объектов:
var fooArray = [Foo]()
Если я хочу добавить другой массив с объектом Foo, я могу использовать +=
:
fooArray += anotherFooArray
Этот работает.
Но если я делаю объекты Foo в массиве необязательными:
var fooArray = [Foo?]()
Выполнение конкатенации вызывает ошибку:
[Foo?]() is not identical to 'CGFloat'
Я определенно не понимаю, в чем проблема и какой тип CGFloat связан с этим?
3 ответа
Проблема в том, что Foo
а также Foo?
2 разных типа (необязательный на самом деле является экземпляром Optional<T>
перечисление).
Для добавления в массив элементы должны быть одного типа - Foo
а также Optional<Foo>
нет.
Вы можете решить проблему, просто приведя массив к дополнительному массиву. Foo
s:
fooArray += anotherFooArray as [Foo?]
Что касается вводящего в заблуждение сообщения об ошибке, я думаю, что оно пытается применить перегрузку +=
оператор принимает CGFloat в качестве одного из аргументов, поскольку он не может сопоставить предоставленные параметры с перегрузкой, определенной для типа массива.
Вы делаете пару вещей неправильно. Массив в Swift объявлен так:
var array = []
Также, если вы хотите, чтобы ваши объекты в массиве были необязательными, передаваемые вами объекты также должны быть необязательными:
class Goal {}
var goal1: Goal?
var goal2: Goal?
var goal3: Goal?
var goal4: Goal?
goal2 = Goal() // Initialized
goal4 = Goal() // Initialized
var array = [goal1?, goal2?, goal3?]
добавление нового объекта в массив выполняется путем добавления его:
array.append(goal4?)
В этом примере массива [nil, Goal, nil, Goal] инициализируются цели 2 и 4, а остальные равны нулю. Если вы хотите добавить объект в массив, только если он существует, используйте привязку:
let goal1 = goal1 {
array.append(goal1)
}
Надеюсь это поможет!
Если вы хотите получить массив, который содержит только значения, а не nil
s вы можете использовать reduce
функция для создания нового массива.
let total: [Foo] = reduce(fooArray, otherArray) { acc, foo in
if let foo = foo {
return acc + [foo]
} else {
return acc
}
}
Тип fooArray
является [Foo?]
и тип otherArray
является [Foo]