как осмыслить сопоставление с образцом дополнительных опций в цикле for в swift - PullRequest
0 голосов
/ 08 октября 2018

в практической задаче меня попросили распечатать все элементы, которые не равны nil, в массиве строк, и я понимаю, что

for case let name? in names{
    print(name)
}

сделает эту работу.Но разве это не противоречит интуиции?

В фрагменте я читаю его как «для каждого элемента (с фактическим значением или nil) в именах», но на самом деле это должно быть «для каждого элемента (фактического значения) в именах».

Может ли кто-нибудь помочь мне разобраться во фрагменте?

Ответы [ 2 ]

0 голосов
/ 09 октября 2018

Вы хотите знать, почему этот код:

let names = ["b", nil, "x"]
for case let name? in names {
    print(name)
}

Производит этот вывод:

b
x

Вам интересно, что происходит с nil.

Ответом является «Необязательный шаблон», который можно найти в справочнике по языку :

Необязательный шаблон обеспечивает удобный способ перебора массива необязательных значений.в выражении for-in выполнение тела цикла только для ненулевых элементов.

Ключевое слово case жизненно важно.Это существенно меняет характер цикла for.Как вы можете видеть из этой ошибки компилятора, name? внутри цикла вообще не является обязательным.

compiler error using guard on non-optional

Думайте о ? какоператор, который удаляет необязательность name.Если в результате присваивания будет nil, эта итерация цикла не произойдет, и начнется следующая итерация.

Обратите внимание, что без case вы не получите такого же поведения вообще.

This:

for name in names {
    print(name)
}

Получит этот вывод:

Optional("b")
nil
Optional("x")

И что ни один из них не работает вообще.

enter image description here

enter image description here

0 голосов
/ 09 октября 2018

Вы можете использовать фильтр с условным условием, а затем распечатать результат следующим образом:

let nameNotNil = names.filter{$0 != nil} //filter all values diferent nil
print(nameNotNil) // can be nil if any didnt has strings
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...