Оператор объединения nil
, ??
, не имеет особого смысла после append
, метода, который ничего не возвращает.Общий шаблон с оператором объединения nil
:
let foo = bar() ?? "baz"
, который устанавливает foo
на значение, возвращаемое bar()
, если только этот метод не возвращает nil
, в этом случае foo
будетустановите значение "baz"
.
Правильный синтаксис в Swift 4 для достижения желаемого поведения - использовать параметр default
:
var y = [String: [Int]]()
y["nocrash", default: []].append(1)
Технически, вВ интересах полного раскрытия, вы теоретически можете использовать оператор nil
коалесцирования, как вы обрисовали.Оператор a ?? b
оценивается как a != nil ? a! : b
.
Таким образом, при разумном использовании скобок и замене вашего ==
на =
вы можете сделать (хотя я бы никогда не рекомендовал это) что-то вроде следующего:
y["crash"]?.append(0) ?? (y["crash"] = [0])
Но это анти-паттерн, которого следует избегать.Используйте приведенный выше синтаксис default
.
Типичный шаблон оператора nil
coalescing выглядит следующим образом:
let c = a ?? b
, где a
является необязательным.Если a
не равно nil
, c
будет присвоено значение a
, в противном случае ему будет присвоено значение b
.