Swift 4中如何正确实现类似s[..<(s.endIndex-3)]的子串截取?
Swift 4中实现从字符串末尾向前偏移截取的方法
哈哈,这个问题我刚接触Swift的时候也踩过坑!确实,Swift里的字符串索引不是普通的整数,不能直接像s.endIndex-3这样操作,因为String的Index是和字符的Unicode编码绑定的,得用专门的API来处理偏移。下面给你两种简单可行的实现方式:
方法一:用offset(by:limitedBy:)获取偏移后的索引
这个方法最贴合你原有思路,通过给endIndex设置偏移量得到目标索引,还能顺便处理字符串长度不足的边界情况:
let s = "aString" // 从endIndex往前偏移3个位置,同时限制不能超过startIndex(避免越界) guard let targetIndex = s.endIndex.offset(by: -3, limitedBy: s.startIndex) else { print("字符串长度不足3,无法完成截取") return } let subS = s[..<targetIndex] // 结果是"aStr" // 如果需要长期持有子串,建议转成String类型 let subStr = String(subS)
方法二:用prefix(_:)直接截取指定长度的前缀
如果你的需求就是保留前「总长度-3」个字符,用prefix会更简洁:
let s = "aString" let targetLength = s.count - 3 if targetLength > 0 { let subS = s.prefix(targetLength) // 结果是"aStr" let subStr = String(subS) } else { print("字符串太短啦,没法截取想要的子串") }
小提醒
- Swift里
prefix返回的是Substring类型,它会共享原字符串的内存,如果你需要长期持有这个子串,记得转成String类型。 - 之所以不能直接对
Index做整数加减,是因为Swift字符串基于Unicode标量,不同字符(比如emoji、中文)占用的存储空间不同,用整数索引会导致定位错误,所以必须用String.Index来精准定位字符位置。
内容的提问来源于stack exchange,提问作者JsW
相关产品推荐
相关产品推荐

