Swift – выход из внешней функции из закрытия

В Котлине вы можете вернуться из внешней функции из замыкания.

fun main(args: Array<String>) { val letters = listOf("A", "B", "C") fun lookForLetter(letter: String, letters: List<String>){ letters.forEach { l -> if (l == letter) { println("Found") return } println(l) } println("Completed") } lookForLetter("A", letters = letters) } 

Вывод:

Найденный

В Swift возврат завершает выполнение закрытия

 var letters = ["A", "B", "C"] func lookForLetter(letter: String, letters: [String]) { letters.forEach { (l) in if l == letter { print("Found"); return } print(l) } print("Completed") } lookForLetter(letter: "A", letters: letters) 

Вывод:

Найденный

В

С

Завершенный

Есть ли способ добиться того же результата в Свифт?

Swift не имеет нелокальных возвратов от закрытия. Другими словами, нет прямого способа возврата из нескольких уровней. Это работает только с встроенными функциями в Котлине, но Swift не имеет такого различия.

Существуют и другие методы сбора, которые останавливаются после нахождения элемента, например index(where:) .

 func lookForLetter(letter: String, letters: [String]) { guard let _ = letters.index(where: { (l) in if l == letter { print("Found"); return true } print(l) return false }) else { print("Completed") return } } 

Эй, быстро, тебе это нравится

 func lookForLetter(letter: String, letters: [String]) { for l in letters { if l == letter { print("Found"); return; } print(l) } print("Completed") 

}

также

Использование метода forEach отличается от цикла for-in двумя важными способами:

  1. Вы не можете использовать оператор break или continue для выхода из текущего вызова закрытия тела или пропустить последующие вызовы.

  2. Использование оператора return в закрытии тела будет выходить только из текущего вызова в тело, а не из любой внешней области, и не будет пропускать последующие вызовы.

https://developer.apple.com/documentation/swift/array/1689783-foreach

Intereting Posts
Kotlin Multiple Layer it Reference Должны ли файлы Kotlin помещаться в отдельный исходный каталог на Android? смеющийся отложенный ответ сервера Выражения объекта Kotlin: пример компаратора Как получить доступ к переменной экземпляра в статическом сопутствующем объекте в Koltin Разрешены только безопасные или неаудированные звонки, разрешенные для нулевого типа приемника arraylist Как перевести java-интерфейс в kotlin Как сохранить объект класса данных в общих предпочтениях с помощью Kotlin? Что такое объект объекта в Котлине как присоединиться к двум таблицам в android, используя метод запросов поставщика контента? Как я могу изменить версию компилятора Kotlin на IntelliJ? IncompatibleClassChangeError: класс 'java.lang.VirtualMachineError' не реализует интерфейс 'java.lang.CharSequence' javax.time в Котлине Какова наилучшая практика для создания настраиваемого компонента пользовательского интерфейса в tornadofx? TornadoFX – удалить элемент с помощью контекстного меню правой кнопкой мыши