Swift 5.7 RegexBuilder: вложенный TryCapture - преобразование/отображение вывода?

Здесь, в этом примере, я попытался захватить два значения Int, а затем захватить их вместе в виде структуры. Это дает ошибку «Поток 1: сигнал SIGABRT».

(ПРИМЕЧАНИЕ. Я знаю, что мой пример можно исправить, просто не вложив захваты и обрабатывая сопоставление шаблонов по-другому. Это просто упрощенный пример кода для этого вопроса.)

      let intCapture = Regex {
    TryCapture(as: Reference(Int.self)) {
        OneOrMore(.digit)
    } transform: { result in
        return Int(result)
    }
}

let mainPattern = Regex {
    TryCapture(as: Reference(Floor.self)) {
        "floor #: "
        intCapture
        " has "
        intCapture
        " rooms"
    }transform: { ( stringMatch, floorInt, roomInt )  in
        return Floor(floorNumber: floorInt, roomCount: roomInt)
    }
}

struct Floor {
    let floorNumber: Int
    let roomCount: Int
}

let testString = "floor #: 34 has 25 rooms"

let floorData = testString.firstMatch(of: mainPattern)

Изучив его, я обнаружил, что в «преобразовании» mainPattern «floorInt» и «roomInt» вызывают проблему.

Забавно то, что когда вы смотрите на кнопку «Быстрая справка»/Option+щелчок, вы видите, что они оба имеют тип Int! Он знает, что там, но вы не в состоянии захватить это!

Далее, когда я стираю один из них, скажем, «floorInt», он выдает эту ошибку:

      Contextual closure type '(Substring) throws -> Floor?' expects 1 argument, but 2 were used in closure body

Так что на самом деле, хотя по НЕКОТОРОЙ причине он знает, что там есть два захваченных значения Int, он не позволяет вам получить к ним доступ ради преобразования.

Не удержавшись, мне помог в другом вопросе очень полезный пользователь, который указал мне на заявку Evolution, где они упомянули .mapOutput, но, к сожалению, эта конкретная функция никогда не была реализована!

Нет ли реального способа создать новое преобразованное значение из вложенных преобразованных значений, подобных этому? Любая помощь будет принята с благодарностью.

0 ответов

Другие вопросы по тегам