2016-03-09 2 views
2

Глядя на следующий код (детская площадка готова).Unwrapping создает барьер для типов значений

Я не могу добавить данные в развернутый необязательный массив из инструкции if let.

Какой лучший способ разрешить добавление для необязательного массива?

class ValueTypeTest { 
    var data: [Int]? 

    func tryAppend() { 
     if var unwrappedData = self.data { 
      unwrappedData += [2, 3] // problem ! 
      self.data! += [4, 5] // works 
     } else { 
      // Initialize paging and initial results 
      self.data = [0, 1] 
     } 

    } 
} 

var v = ValueTypeTest() 
v.data // nil 
v.tryAppend() 
v.data // [0, 1] 
v.tryAppend() 
v.data // expected: [0, 1, 2, 3, 4, 5] actual: [0, 1, 4, 5] 
+0

Кажется, что ваш дизайн неправильный. Операция 'tryAppend()', которая всегда преуспевает, кажется, противоречит идее о том, что массив является необязательным. Я уверен, что ваш пример является упрощенным и может не содержать некоторых деталей вашего фактического кода, но в примере, который вы предоставляете, пустой необязательный массив кажется явно более подходящим, чем дополнительный. –

ответ

1

Поскольку массив является значения типа и будет скопирован, когда вы делаете if var операцию. Поэтому вы не меняете self.data, но unwrappedData.

Попробуйте это:

self.data = (self.data ?? [0, 1]) + [2, 3, 4, 5] 

Это то, что я имею в виду.

func tryAppend() { 
    if let unwrappedData = self.data { 
     self.data = unwrappedData + [2, 3, 4, 5] 
    } else { 
     // Initialize paging and initial results 
     self.data = [0, 1] 
    } 
} 
+0

Спасибо, но присваивание self.data превосходит цель разворачивания. Я согласен, что это лучший синтаксис. Мне просто интересно, является ли это рекомендуемым решением. –

+1

@MaximVeksler Ну, по крайней мере, вы можете сделать 'self.data = unwrappedData + [2, 3]'. Это может лучше соответствовать вашей цели? Если вы думаете об этом, это в значительной степени то, что вы можете сделать, открывая тип значения. –

+0

согласны. Пожалуйста, уточните свой ответ? Я посмотрю, если это имеет смысл и принять. –

0

var unwrappedData объявлена ​​внутри функции tryAppend() является локальной переменной для этой функции.

В таблице результатов на этой строке показан вывод, содержащий: [0, 1, 2, 3] для unwrappedData.

Смежные вопросы