Почему компилятор выдает ошибку (прерывание прерывания: 6) при использовании ??оператор словаря - PullRequest
0 голосов
/ 26 декабря 2018

Это мой код:

func x() {
    var y = [String: [Int]]()
    y["crash"]?.append(1) ?? y["crash"] == [1]
}

Почему это мгновенно выдает ошибку компилятора?y["crash"]?.append(1) имеет тип возврата ()?, в то время как y["crash"] == [1] имеет тип возврата (), поэтому мой код выглядит корректным с первого взгляда.

1 Ответ

0 голосов
/ 26 декабря 2018

Оператор объединения 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.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...