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
相关产品推荐
相关产品推荐

