Swift中NSRegularExpression匹配后截取字符串的下标错误问题求助
substring(with:)弃用后下标报错的问题 首先咱们拆解下你遇到的问题核心:
问题根源
你看到的错误Subscript 'subscript(_:)' requires the types 'String.Index' and 'Int' be equivalent,本质是没有导入Foundation模块时,Swift标准库的String并不支持直接用Range<String.Index>作为下标。而String[Range<String.Index>]这个语法是Foundation给String添加的扩展方法,必须显式导入Foundation才能生效。
另外你虽然在使用NSRegularExpression(它本身就是Foundation的类),但如果没有显式导入Foundation,编译器可能只加载了部分Foundation组件,没包含String的下标扩展,才导致了报错。
解决方案1:显式导入Foundation(推荐)
既然你已经在使用NSRegularExpression,导入Foundation是完全合理的,也是最简单的解决方式:
- 在文件顶部添加导入语句:
import Foundation
- 修改返回语句为Swift 5推荐的写法(注意转成
String,因为下标返回的是Substring,和函数返回类型更匹配):
return String(intext[mrange])
这样既解决了弃用警告,也不会再出现下标错误。
解决方案2:不导入Foundation的替代写法(不推荐,因已依赖Foundation)
如果出于特殊原因不能导入Foundation,可以用Swift标准库自带的prefix和suffix方法构建子字符串:
guard let mrange = Range(match.range(at: 1), in:intext) else { return nil } let start = mrange.lowerBound let end = mrange.upperBound let substring = intext.prefix(upTo: end).suffix(from: start) return String(substring)
这个写法完全基于Swift标准库,不需要Foundation支持,但代码会稍微繁琐一些。
补充说明
为什么NSRegularExpression能正常使用却没导入Foundation?可能是你的项目中某个依赖间接导入了Foundation,或者编译器在某些场景下自动导入了部分Foundation组件,但没包含String的扩展部分。显式导入Foundation能彻底避免这种模糊的问题。
内容的提问来源于stack exchange,提问作者helot

