Swift类型擦除Regex构建器:函数返回类型声明问题
问题解决步骤
1. 修复Optionally的语法错误
你遇到的Type '() -> ()' cannot conform to 'RegexComponent'错误,是因为在Regex Builder的Optionally闭包里直接使用了if控制流语句——Regex DSL要求闭包内的内容必须是符合RegexComponent的表达式,而if本身不是合法的组件。
修改方式是先根据strictLength条件构建对应的数字重复组件,再把它和前缀"6"组合后放入Optionally中:
static func numberStartingWith6(strictLength: Bool) -> some RegexComponent { // 先根据条件定义数字重复部分 let digitsPart: some RegexComponent = strictLength ? Repeat(CharacterClass.digit, count: 9) : Repeat(0...8) { CharacterClass.digit } let myRegex = Regex { Optionally { "6" digitsPart } } return myRegex // 原代码遗漏了return语句,需要补充 }
2. 实现类型擦除的返回类型
如果想要彻底擦除底层具体类型,不需要关注Regex Builder生成的复杂嵌套类型,可以做以下两种选择:
选择一:返回any RegexComponent(完全类型擦除)
直接把返回类型改为any RegexComponent,这是Swift的存在类型,会隐藏所有具体实现细节:
static func numberStartingWith6(strictLength: Bool) -> any RegexComponent { let digitsPart: some RegexComponent = strictLength ? Repeat(CharacterClass.digit, count: 9) : Repeat(0...8) { CharacterClass.digit } return Regex { Optionally { "6" digitsPart } } }
选择二:返回Regex<Substring>(更明确的类型)
因为你最终构建的是Regex实例,而Regex<Output>本身就符合RegexComponent协议,返回这个类型既明确又能避免复杂的嵌套类型暴露:
static func numberStartingWith6(strictLength: Bool) -> Regex<Substring> { let digitsPart: some RegexComponent = strictLength ? Repeat(CharacterClass.digit, count: 9) : Repeat(0...8) { CharacterClass.digit } return Regex { Optionally { "6" digitsPart } } }
内容的提问来源于stack exchange,提问作者JAHelia
相关产品推荐
相关产品推荐

