Передача локали в RegexBuilder
Я создаю токенизатор и хотел бы представить это как структуру, передавая локаль.
Вот суть того, что я хочу написать:
struct Tokeniser {
private let locale: Locale
private let integerRegex: Regex
init(locale: Locale) {
self.locale: Locale
self.integerRegex = Regex {
Capture {
.localizedInteger(locale: locale)
} transform: {
Token.number($0)
}
}
}
func parse(text: String) -> Token {
if let match = try integerRegex.firstMatch(in: text) {
//... other code here
}
}
\\...other code here
}
Поскольку Regex является универсальным, компилятор предлагает установитьintegerRegex
тип дляRegex<Any>
, но это вызывает еще один набор проблем с компилятором, тип которого я не смог определить. Итак, я попытался написать что-то вроде этого (вдохновленный SwiftUI):
var integerRegex: some Regex {
Capture {
.localizedInteger(locale: locale)
} transform: {
Token.number($0)
}
}
Но компилятор снова предлагает мне ввести Regex.
Единственный способ передать структуру компилятору — это создать ленивые переменные, которые затем имеют побочный эффект: мне приходится помечать свои функции как изменяемые, что приводит к проблемам в дальнейшем при вызове из структур SwiftUI.
lazy var integerRegex = Regex {
Capture {
.localizedInteger(locale: locale)
}
}
mutating func parse(text: String) -> Token {
if let match = try integerRegex.firstMatch(in: text) {
}
}
Как мне это закодировать?