Я понимаю, что это черновик предложения .Я попытался реализовать простой DSL для построения строки, например так:
@_functionBuilder
struct StringBuilder {
static func buildExpression(_ string: String) -> [String] {
[string]
}
static func buildBlock(_ children: [String]...) -> [String] {
children.flatMap{ $0 }
}
}
func s(separator: String = "", @StringBuilder _ makeString: () -> [String]) -> String {
makeString().joined(separator: separator)
}
let z = s(separator: " ") {
"this"
"is"
"cool"
}
Однако компилятор жалуется, что «String» не конвертируется в «[String]».Это заставляет меня полагать, что buildBlock
- единственная часть предложения, которое в настоящее время реализовано.(Это понятно, учитывая, что в SwiftUI они строят иерархию представлений, так что это все, что им нужно.)
Это правильно или я что-то не так делаю?Как правильно использовать buildExpression
?
Ответ ielyamani показывает, как создать построитель рабочей строки, такой как я использовал в моем примере выше.Однако это не решает актуальную проблему.Я не пытаюсь построить строитель строк.Я пытаюсь выяснить функции строителей.Строитель строк - только пример.Например, если мы хотим иметь построитель строк, который принимает целые числа, мы можем теоретически сделать следующее:
@_functionBuilder
struct StringBuilder {
static func buildExpression(_ int: Int) -> [String] {
["\(int)"]
}
// The rest of it implemented just as above
}
В этом случае, когда компилятор обнаружил Int
, он вызвал бы buildExpression
чтобы потом выплюнуть наш тип компонента, в данном случае [String]
.Но, как сказал Мартин Р. в комментарии к этому вопросу, buildExpression
в настоящее время не реализовано.