Конкатенация массива к другому массиву необязательных значений с помощью оператора "+="

У меня есть массив объектов:

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> нет.

Вы можете решить проблему, просто приведя массив к дополнительному массиву. Foos:

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]

Другие вопросы по тегам