Я работаю над парсером String
, в котором вход может иметь различные форматы, и я заранее не знаю, какой формат используется, поэтому мне нужно написать что-то гибкое.Swift строка синтаксиса с различными форматами
Первый шаг должен проверить первые несколько символов, я могу проверить, что при использовании, например:
func parse(input: String) -> String {
let result: String
if (input.hasPrefix("foo") {
result = doFoo(input)
}
else if (input.hasPrefix("bar") {
result = doBar(input)
}
else if (input.hasPrefix("baz") {
result = doBaz(input)
}
else {
result = doBasic(input)
}
return result
}
и каждый doXXX()
функция имеет собственный код синтаксического анализа, который снова может иметь несколько вариантов, таких как разные разделители и т. д.
Это может легко превратиться в много кода if-else, и мне интересно, есть ли у Swift более простой способ сделать это. Может быть, использование операторов switch-case или что-то еще? Могу ли я использовать перечисление для этого?
EDIT: код находится внутри расширения String
.
Это выглядит многообещающим. К сожалению, я получаю ошибку компилятора для первого 'func':' Member operator '~ =' должен иметь хотя бы один аргумент типа 'String'; 'Мне также пришлось добавить ключевое слово' static' к этому 'func'. У меня есть код синтаксического анализа в расширении 'String', может ли это вызвать ошибку? – Koen
Я специально создал оператор '~ =' generic, поэтому он применим к любым типам. В этом случае она должна быть свободной стоячей функцией. Если вы действительно хотите сохранить его в расширении 'String', тогда вы можете специализировать его на' String' вместо общего 'T', но я советую против этого. – Alexander
Я изменил это, и теперь он работает (я использую 'parse2'). – Koen