Swift中如何获取多行字符串字面量的匹配字符串索引
嘿,我来帮你解决这个多行字符串的索引问题!看起来你之前在拆分字符串后遍历索引时遇到了全为0的坑,咱们一步步来搞定:
解决方案
1. 获取多行字符串中各字符串的索引值
首先得把多行字符串拆分成独立单行的数组,然后用Swift自带的方法就能轻松拿到索引。这里要注意过滤掉拆分后可能出现的空行(比如字符串首尾的换行),避免干扰索引计算:
// 定义你的多行字符串 let multiLineString = """ Product 1 description Product 1 color Product 2 description Product 2 color """ let keyword = "Product 2 description" // 拆分并过滤空行,得到有效单行数组 let lines = multiLineString.components(separatedBy: .newlines).filter { !$0.isEmpty } // 方法一:直接查找匹配项的索引 if let matchingIndex = lines.firstIndex(of: keyword) { print(matchingIndex) // 输出:2 } else { print("未找到匹配内容") } // 方法二:遍历所有行,逐个检查并获取索引 for (index, line) in lines.enumerated() { if line == keyword { print(index) // 输出:2 } }
2. 定义迭代时动态变化的计数变量
如果你不想用enumerated(),也可以手动维护一个计数变量,在循环里逐次递增:
var lineCount = 0 for line in lines { if line == keyword { print("匹配索引:\(lineCount)") // 输出:2 } lineCount += 1 }
不过更推荐用enumerated(),它是Swift官方提供的简洁方案,自动帮你维护从0开始的索引值,不用手动处理计数逻辑。
3. 将多行字符串转换为带索引的列表
你可以把拆分后的单行数组和索引组合成元组数组,或者自定义结构体来存储,让数据结构更清晰:
// 方式一:转成(索引, 内容)的元组数组 let indexedLines = Array(lines.enumerated()) // 输出示例:[(0, "Product 1 description"), (1, "Product 1 color"), (2, "Product 2 description"), (3, "Product 2 color")] print(indexedLines) // 方式二:自定义结构体存储,可读性更强 struct IndexedLine { let index: Int let content: String } let indexedLineList = lines.enumerated().map { IndexedLine(index: $0.offset, content: $0.element) }
为啥你之前用enumerate()时索引全为0?
大概率是拆分字符串的步骤出了问题——比如用了错误的分隔符,导致整个多行字符串被当成了数组里的唯一一个元素,遍历的时候自然只有索引0。用components(separatedBy: .newlines)可以适配不同平台的换行符,再加上过滤空行的操作,就能保证数组里的每个元素都是有效的单行内容,索引也就会正常从0递增啦。
内容的提问来源于stack exchange,提问作者solo
相关产品推荐
相关产品推荐

