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

SwiftUI中不使用@Published如何让计算属性重新求值?

解决方案

要让视图在点击按钮时重新计算Test类的计算属性value并更新,核心是手动触发ObservableObject的变更通知,让SwiftUI重新渲染视图(此时会重新读取计算属性的值)。

有两种实现方式:

方式一:直接在按钮点击时发送变更通知

修改ContentView的按钮点击逻辑,手动调用objectWillChange.send():

struct ContentView: View {
    @StateObject var test: Test = Test.shared
    
    var body: some View {
        VStack {
            Text(test.value)
            
            Button("update") {
                // 手动发送对象变更通知,触发视图刷新
                test.objectWillChange.send()
            }
        }
        .frame(width: 300.0, height: 300.0)
    }
}

class Test: ObservableObject {
    static let shared: Test = Test()
    
    var value: String {
        return String(describing: Int.random(in: 1...1000))
    }
}

方式二:封装更新逻辑到Test类中

在Test类里添加一个方法专门触发变更通知,按钮点击时调用该方法,代码更具封装性:

struct ContentView: View {
    @StateObject var test: Test = Test.shared
    
    var body: some View {
        VStack {
            Text(test.value)
            
            Button("update") {
                test.triggerUpdate()
            }
        }
        .frame(width: 300.0, height: 300.0)
    }
}

class Test: ObservableObject {
    static let shared: Test = Test()
    
    var value: String {
        return String(describing: Int.random(in: 1...1000))
    }
    
    func triggerUpdate() {
        // 手动发送变更通知
        objectWillChange.send()
    }
}

原理说明

ObservableObject通过objectWillChange这个Publisher通知SwiftUI视图更新。由于计算属性value不会自动触发变更通知,所以需要手动调用objectWillChange.send(),让视图重新渲染。每次视图渲染时,都会重新访问test.value,此时计算属性会重新执行getter逻辑,生成新的随机字符串。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.11 10:18:56