Добавление элементов в дополнительные массивы в Swift

Каков правильный способ добавления элемента в конец необязательного массива? Скажем, у меня есть необязательный массив, myArray, и я хочу добавить '99' в конец. Append() не работает в массиве nil, поэтому единственным решением, которое я могу найти, является следующее, но оно не выглядит очень элегантным:

var myArray = [Int]?()

if myArray?.count > 0 {
    myArray?.append(99)
} else {
    myArray = [99]
}

Ответ 1

Вы можете использовать тот факт, что методы, вызываемые с помощью опциональной цепочки, всегда возвращают необязательное значение, которое равно nil, если это невозможно вызовите метод:

if (myArray?.append(99)) == nil {
    myArray = [99] 
}

Если myArray != nil, то myArray?.append(99) добавляет новый элемент и возвращает Void, так что if-блок не выполняется.

Если myArray == nil, то myArray?.append(99) ничего не делает и возвращает nil, так что выполняется if-block и присваивает значение массива.

Ответ 2

@MartinR ответ - правильный ответ, однако, только ради полноты, если у вас есть необязательный и вы хотите делать разные действия в зависимости от того, хотите ли вы это или нет, вы можете просто проверить, не ноль (или нет):

if myArray != nil {
    myArray?.append(99)
} else {
    myArray = [99]
}

Обратите внимание, что (как вы, вероятно, выяснили) необязательное связывание не работает в вашем случае, потому что массив является типом значения: он создаст копию массива и добавит к нему новый элемент, фактически не влияя на исходный массив:

// Wrong implementation - the new item is appended to a copy of myArray
if var myArray = myArray {
    myArray.append(99)
} else {
    myArray = [99]
}

Ответ 3

Вместо использования append попробуйте использовать оператор слияния массива. Потому что результатом является необязательный оператор nil coalescing для назначения одного массива элементов, когда начальный массив был равен nil.

var myArray = [Int]?()

myArray? += [99]
myArray = myArray ?? [99]

Я попытался объединить его в одно строковое выражение, но, к сожалению, Swift ему это не нравится

myArray = (myArray? += [99]) ?? [99]

Ответ 4

Мой единственный вкладыш, использующий ноль коалесцирующих:

myArray = (myArray ?? []) + [99]