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

Swift类方法修改成员变量后,如何同步更新lazy属性数组?

Swift中lazy变量未同步更新的问题分析与解决

问题代码

class QuizQuestions {
    
    var gender = "it"
    
    func chooseGender(genderButton: String) {
        if genderButton == "Female" {
            gender = "she" }
        print(gender)
    }
    
    lazy var questions = ["Does \(gender) run?", "Is \(gender) fun?"]
    
}

调用chooseGender后,gender已更新为"she",但questions数组中的字符串仍显示初始的"it"。

原因

lazy var是延迟初始化属性,仅在第一次被访问时执行初始化逻辑。当questions首次被读取时,会把当时gender的默认值"it"代入字符串生成数组,之后即使gender改变,已经生成的数组不会自动重新计算,所以内容不会更新。

解决方法

方案1:将questions改为计算属性

计算属性每次被访问时都会重新计算返回值,能自动同步最新的gender:

class QuizQuestions {
    
    var gender = "it"
    
    func chooseGender(genderButton: String) {
        if genderButton == "Female" {
            gender = "she"
        }
        print(gender)
    }
    
    var questions: [String] {
        ["Does \(gender) run?", "Is \(gender) fun?"]
    }
    
}

方案2:利用属性观察者手动更新

给gender添加didSet观察者,每次gender改变时重新初始化questions:

class QuizQuestions {
    
    var gender = "it" {
        didSet {
            questions = ["Does \(gender) run?", "Is \(gender) fun?"]
        }
    }
    
    func chooseGender(genderButton: String) {
        if genderButton == "Female" {
            gender = "she"
        }
        print(gender)
    }
    
    var questions = ["Does \(gender) run?", "Is \(gender) fun?"]
    
}

这里需要移除lazy修饰符,确保初始状态下questions能正确初始化,后续依赖didSet触发更新。

方案3:用函数返回最新数组

如果不需要持久存储questions,可以用函数每次生成最新的数组:

class QuizQuestions {
    
    var gender = "it"
    
    func chooseGender(genderButton: String) {
        if genderButton == "Female" {
            gender = "she"
        }
        print(gender)
    }
    
    func getQuestions() -> [String] {
        ["Does \(gender) run?", "Is \(gender) fun?"]
    }
    
}

内容的提问来源于stack exchange,提问作者Jake Jake

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.20 23:48:22