Свифт-возврат с охраной? - PullRequest
       20

Свифт-возврат с охраной?

0 голосов
/ 20 сентября 2019

Я пытаюсь перевести некоторый код Swift на C#.Я читаю документы, но не могу понять, что делает этот блок кода.Я не могу запустить код, так что это делает его еще сложнее.Пожалуйста, помогите!

do {
    oldArray.enumerated().forEach { oldTuple in
        guard case .entry = oldTuple.element else {
            return
        }

        // Do stuff
    }
}
  1. Это return эквивалентно break?
  2. Что такое условие guard?Некоторое задание ...?

1 Ответ

1 голос
/ 20 сентября 2019

Спортивные площадки Swift - отличное место для изучения языка.Несмотря на то, что вы не можете запустить весь код, вы можете поместить несколько частей поддержки вокруг него, чтобы увидеть, что происходит.

oldArray явно содержит некоторые значения enum.Из вашего фрагмента видно, что одним из значений является .entry.Я создал enum с именем State для целей исследования и дал ему несколько случаев (entry, foo, bar).

Теперь бросьте свой фрагмент в функцию и дайтеэто oldArray для работы.Добавьте print в раздел // Do stuff, и правда будет раскрыта:

enum State {
    case entry
    case foo
    case bar
}

func test() {
    let oldArray: [State] = [.entry, .entry, .bar, .entry, .foo]

    do {
        oldArray.enumerated().forEach { oldTuple in
            guard case .entry = oldTuple.element else {
                return
            }

            // Do stuff
            print(oldTuple)
        }
    }
}

test()

Вывод

(offset: 0, element: __lldb_expr_1.State.entry)
(offset: 1, element: __lldb_expr_1.State.entry)
(offset: 3, element: __lldb_expr_1.State.entry)

Isreturn эквивалентно break?

Возвращается из замыкания, если не выполнено условие guard.

Что такое guard условие?Некоторое задание ...?

.enumerated превращает oldArray в последовательность (offset: Int, element: State) кортежей.Таким образом, массив примеров становится [(offset: 0, element: .entry), (offset: 1, element: .entry), ...].forEach принимает каждый из этих кортежей по очереди и присваивает его oldTuple.

guard использует сопоставление с шаблоном , чтобы убедиться, что значение element текущего кортежа равно .entry в противном случае он выходит из замыкания.

Синтаксис немного странный, но он говорит, что для продолжения за пределами этого оператора, element текущего кортежа должен быть .entry, иначе return из замыкания и прекращения обработки этого элемента .

Итак, этот код перебирает массив перечислений и обрабатывает только те, которые .entry.

ЧтоЧто делает do?

Ничего, что мы можем видеть из вашего фрагмента.Если вы закомментируете do { и соответствующий }, тест все равно сделает то же самое.do обычно используется с Ошибка при передаче для окружения вызовов, которые могут throw содержать ошибку.Операторы do обычно используются с операторами catch, которые затем отлавливают возникшую ошибку.Сам по себе do { } просто создает новую область.

...