возврат и выход из CompactMap - PullRequest
       3

возврат и выход из CompactMap

0 голосов
/ 13 февраля 2019

Я проверяю некоторые динамические тексты с Правилами регулярных выражений , используя switch для каждого index шаблона регулярных выражений array.все работает нормально, но в последнем case я хочу, чтобы карта перестала отображать карту и сделала ранний возврат!но кажется, что я не могу return внутри функции карты!Есть ли лучший подход или решение?

fileprivate func regexMatch(pattern regex: [String], in text: String) -> Dictionary<String, Any>
{
    do
    {
        for (index, string) in regex.enumerated()
        {
            let regex = try NSRegularExpression(pattern: string, options: .caseInsensitive)
            let results: [NSTextCheckingResult] = regex.matches(in: text, range: NSRange(text.startIndex..., in: text))

            _ = results.compactMap
            {
                /* If i put a guard check to see if result is filled 
                 * then return, works fine but iterates again for the next index and keeps returning till it’s over!
                */
                switch index
                {
                case 0:
                    // Does something
                case 1:
                    // Does something else
                case 2:
                    // Does the last thing
                    // If succeed finding the match! Just return or exit the map!
                    let carNames = String(Range($0.range, in: text).map { String(text[$0]) }!).lowercased()

                    for case let car as Car in carsList!
                    {
                        if spottedCarNamesInReceipt.contains(car.name!.lowercased())
                        {
                            result["car"] = car
                            return  // This does work though, but the map starts iterating again over the next index!
                        }
                    }

                default:
                    break;
                }
            }
        }

        return result

    } catch let error
    {
        print("Invalid regex: \(error.localizedDescription)")
        return [:]
    }

Ответы [ 2 ]

0 голосов
/ 13 февраля 2019

Использование return оператора forEach цикла или любого вида Maps, происходит только для текущего вызова в замыкании, в то время как for...in цикл также завершает все последующие последующие вызовы.поэтому for...in решает проблему, если требуется ранний выход.

0 голосов
/ 13 февраля 2019

Вам не нужно использовать compactMap, если вы не используете результаты.И нет выхода из CompactMap.Используйте для в цикле.

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