Swift中设置可变控件属性为常量是否合法?值联动疑问
关于Swift常量与控件属性同步的问题解答
嗨,这个问题一点都不基础,很多刚接触Swift的开发者都会遇到类似的困惑,完全不用抱歉~
先直接给你答案:如果用let声明的常量存储控件属性(比如label.text),当控件属性值变化时,常量的值不会随之改变。原因得从Swift的类型和常量机制说起:
- Swift里的
let常量,本质是一旦赋值后就不能再修改其存储的内容。而String(也就是label.text的类型)是值类型,当你执行let myText = label.text时,其实是把当前label.text的值拷贝了一份存在myText里。之后哪怕label.text被改成新的字符串,myText里存储的还是最初那份拷贝的值,不会自动同步更新。
那如果想要实现“某个值始终和控件属性保持相等”的需求,你可以用这两种方式:
方式1:使用计算属性
计算属性不会存储固定值,每次访问它时都会动态读取最新的控件属性值,完美满足同步需求:
// 定义一个计算属性,每次访问都会获取label的最新text var currentLabelText: String? { get { return label.text } }
之后你每次访问currentLabelText,拿到的都是label.text的最新值,相当于始终和控件属性同步。
方式2:监听属性变化(主动响应更新)
如果需要在控件属性变化时 Injury丰 wode**伊 periodically pos功能,###,可以用KVO或者Combine框架来监听label.text的变化。举个Combine的例子:
import Combine // 先声明一个存储订阅的集合,避免订阅被提前释放 var cancellables = Set<AnyCancellable>() // 监听label的text属性变化 label.publisher(for: \.text) .sink { newText in // 这里可以拿到每次变化后的新值,做你需要的处理 print("Label的文字变成了:\(newText ?? "空值")") // 如果需要同步到某个变量,也可以在这里赋值 // self.someVariable = newText } .store(in: &cancellables)
另外补充一下:Swift提示你把变量改成常量,是因为它检测到你当前代码里只读取这个值、没有修改它,这是Swift的最佳实践建议,但这个建议和你想要的“同步控件属性”是两个不同的场景——普通的let常量做不到动态同步,得用上面说的计算属性或者监听的方式。
内容的提问来源于stack exchange,提问作者phoenix
相关产品推荐
相关产品推荐

