MST

星途 面试题库

面试题:Swift字符串的子串提取

给定一个Swift字符串 "Hello, World! This is a test.",请编写代码提取出从第7个字符开始,长度为5的子串。同时解释一下Swift中获取子串的原理及注意事项。
29.2万 热度难度
编程语言Swift

知识考点

AI 面试

面试题答案

一键面试

代码实现

let originalString = "Hello, World! This is a test."
let startIndex = originalString.index(originalString.startIndex, offsetBy: 6)
let endIndex = originalString.index(startIndex, offsetBy: 5)
let subString = String(originalString[startIndex..<endIndex])
print(subString)

Swift中获取子串的原理

  1. 索引(Index):在Swift中,字符串是由Character组成的集合,每个Character都有对应的索引。String的索引是基于UTF-16代码单元的,而不是字符数量。startIndex表示字符串的第一个字符的索引,endIndex表示字符串最后一个字符之后的位置。
  2. 创建子串范围:通过index(_:offsetBy:)方法可以从某个索引开始,根据偏移量计算出另一个索引。例如originalString.index(originalString.startIndex, offsetBy: 6)从字符串起始位置偏移6个代码单元得到起始索引,然后再通过同样的方式得到结束索引,两者组成半开区间[startIndex..<endIndex],这个区间定义了子串的范围。
  3. 提取子串:使用subscript操作符[startIndex..<endIndex]提取出子串,由于直接获取的是Substring类型,而在需要String类型的场景下,可以通过String初始化器将Substring转换为String

注意事项

  1. 索引越界:在计算索引偏移量时,要确保偏移量不会导致索引越界。如果偏移量超过了字符串的长度,会抛出String.IndexDistanceOutOfBounds错误。
  2. 字符与代码单元:由于Swift的字符串索引基于UTF - 16代码单元,对于一些复杂字符(如表情符号可能由多个代码单元组成),偏移量计算时要特别小心,避免分割字符的情况。如果想按字符数量计算偏移,需要使用String.CharacterView相关方法。
  3. 内存管理Substring类型共享原字符串的存储,在原字符串生命周期结束后,Substring也无法使用。如果需要长期保存子串,应及时转换为String类型,以避免潜在的内存访问问题。