2015-08-08 2 views
3

Учитывая каталог и ключ, я хочу, чтобы увеличить значение этого ключа, если он существует в словаре, или инициализировать его в 1.Наиболее оптимальный способ увеличения или инициализировать Int в Swift словарь

The Тип словаря - Словарь, но по дизайну тип значения для этого ключа всегда будет Int, поскольку он будет изменен только этим кодом.

Код, который я до сих пор ниже, но хотел бы его оптимизировать в стремительном стиле.

 let v = dict[key] as? Int 
     if v != nil { 
      dict[key] = v! + 1 
     } else { 
      dict[key] = 1 
     } 

ответ

6

Один из способов будет использовать всухую оператор коалесцирующий:

dict[key] = ((dict[key] as? Int) ?? 0) + 1 

Если вы знаете тип словаря вы можете почти сделать то же самое, но без литья:

dict[key] = (dict[key] ?? 0) + 1 

Объяснение:

Этот оператор (??) имеет опцию с левой стороны и d a необязательно с правой стороны и возвращает значение необязательного, если оно не nil. В противном случае он возвращает правильное значение по умолчанию.

Как это тройное выражение оператора:

dict[key] ?? 0 
// is equivalent to 
dict[key] != nil ? dict[key]! : 0 
+1

Я думаю, что правая сторона ?? также может быть необязательным, поэтому результат будет необязательным, и если у вас есть nil ?? nil, тогда результат будет равен нулю. Удобный для таких вещей, как (firstChoice? SecondChoice? ThirdChoice? DefaultValue) – gnasher729

+0

@ gnasher729 Вы правы. Так как оператор перегружен версией, которая имеет опцию с правой стороны. – Qbyte

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