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, но, к сожалению, эта конкретная функция никогда не была реализована!
Нет ли реального способа создать новое преобразованное значение из вложенных преобразованных значений, подобных этому? Любая помощь будет принята с благодарностью.