已发布值上的 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 属性观察器,但是,它不再工作了。

假设我们有一个名为isSettingOnState 属性。我以前叫这个:

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 绑定

SwiftUI 中的 Toggle() 运算符可以实现整数吗

切换 swiftUI toggle() 时如何触发操作?

有没有办法使用 SwiftUI 将选项绑定到 Toggle / Slider