已发布值上的 SwiftUI toggle() 函数停止使用 Swift 5.2 触发 didSet
Posted
技术标签:
【中文标题】已发布值上的 SwiftUI toggle() 函数停止使用 Swift 5.2 触发 didSet【英文标题】:SwiftUI toggle() function on Published values stopped triggering didSet with Swift 5.2 【发布时间】:2020-03-28 22:39:52 【问题描述】:我刚刚将我的 Xcode 从 11.3 更新到 11.4,我用 SwiftUI 编写的项目开始表现不同。我曾经为布尔值调用toggle()
函数,它曾经触发didSet
属性观察器,但是,它不再工作了。
假设我们有一个名为isSettingOn
的State
属性。我以前叫这个:
isSettingOn.toggle()
触发了属性的didSet
观察者。现在,只要我这样称呼:
isSettingOn = true
它正在工作。
我的项目都是基于这种行为,现在这种变化基本上破坏了一切。有谁知道我是否真的在这里做错了什么?
编辑:
添加了演示代码:
struct ContentView: View
@State var isSettingOn: Bool = true
didSet
print("didSet isSettingOn")
var body: some View
Button(action:
self.isSettingOn = true // will trigger didSet
self.isSettingOn.toggle() // won't trigger didSet
)
Text("Toggle isSettingOn")
【问题讨论】:
在这里工作正常。你能提供演示代码吗? 谢谢@Asperi,我已经用示例代码更新了我的问题。另外,我意识到第一个问题(视图未更新)与我提到的第二个问题(没有触发didSet)有关,因此我也更新了问题内容。 试试这个,它有效! ***.com/a/59391476/8457280 看起来像一个将在下一个 Swift 版本中修复的错误。见github.com/apple/swift/pull/29931 谢谢你们的cmets,我已经发布了一个答案,这是在Xcode 11.5中修复的。 【参考方案1】:这是Xcode 11.4 and 11.4.1
中的一个错误,它已在Xcode 11.5 (Beta)
和Swift 5.2.4
中修复。
【讨论】:
以上是关于已发布值上的 SwiftUI toggle() 函数停止使用 Swift 5.2 触发 didSet的主要内容,如果未能解决你的问题,请参考以下文章
SwiftUI 试图从列表中删除对象但无法在不可变值上使用变异成员:是一个“让”常量
SwiftUI:如何将 .toggle() not Toggle(isOn..) 与 UserDefault 结合使用
UserDefaults 在 SwiftUI 中与 Toggle 绑定