iOS开发:如何用字符串数组替换UILabel文本中的§§§占位符
搞定iOS填空功能:用字符串数组替换§§§占位符
嘿,我明白你现在的需求——已经能替换单个单词,但要把chosenWords数组里的内容按顺序填到文本的§§§占位符里对吧?这其实很容易实现,核心思路就是逐个找到占位符,然后依次替换数组里的元素。
我给你写个完整的代码方案,直接嵌到你的GameVC里就行:
class GameVC: UIViewController { @IBOutlet weak var storyLabel: UILabel! // 从文本文件读取的原始故事文本 var originalStory: String = "" // 你准备好的填空单词数组 var chosenWords: [String] = ["小猫", "花园", "晒太阳"] override func viewDidLoad() { super.viewDidLoad() // 先读取文本文件内容(你已经实现的逻辑) loadStoryFromFile() // 执行填空替换 fillBlanksWithWords() } private func fillBlanksWithWords() { var updatedStory = originalStory var currentWordIndex = 0 // 循环查找并替换每一个§§§占位符 while let placeholderRange = updatedStory.range(of: "§§§") { // 检查是否还有剩余单词可以替换 if currentWordIndex < chosenWords.count { updatedStory.replaceSubrange(placeholderRange, with: chosenWords[currentWordIndex]) currentWordIndex += 1 } else { // 如果单词不够,把剩余占位符替换成提示文本(也可以留空) updatedStory.replaceSubrange(placeholderRange, with: "[待填空]") } } // 把最终结果赋值给UILabel storyLabel.text = updatedStory } // 你已有的读取文本文件方法(给你补个示例参考) private func loadStoryFromFile() { guard let filePath = Bundle.main.path(forResource: "story", ofType: "txt") else { storyLabel.text = "加载故事失败" return } do { originalStory = try String(contentsOfFile: filePath, encoding: .utf8) } catch { print("读取文件错误: \(error.localizedDescription)") storyLabel.text = "加载故事失败" } } }
关键细节说明:
- 用
while循环配合range(of:)逐个定位占位符,这样能保证数组里的单词按顺序填充,而不是一次性把所有占位符换成同一个单词。 - 加了单词数量不足的处理逻辑,避免数组越界,同时给用户明确的提示。
- 代码里的方法都用
private修饰,符合Swift的代码规范,让你的VC结构更清晰。
如果你的chosenWords数组是动态生成的(比如用户输入的),这个逻辑也完全适用,只需要确保数组在调用fillBlanksWithWords()之前已经被正确填充就行。
内容的提问来源于stack exchange,提问作者Truls Sønsteby
相关产品推荐
相关产品推荐

