You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.25 07:09:19