swift - 类 --> 结构时 swiftUI+Combine 中的奇怪行为
问题描述
在 youtube 视频教程中,有一件事引起了我的注意。为了重现它,我创建了一个非常简单的项目。我知道代码的设计并不完美,但我想知道为什么代码在这种特殊情况下会这样。
文件 #1
import SwiftUI
struct ContentView: View {
@ObservedObject var viewModel = ViewModel()
var body: some View {
Text(viewModel.content).onAppear() {
self.viewModel.subsribe()
}
}
}
文件 #2
import Combine
class ViewModel: ObservableObject {
private let model = Model()
@Published var content: String = ""
var subscription: AnyCancellable?
func subsribe() {
subscription = model.getPublisher().sink { value in
self.content = value
}
}
}
文件 #3
import Foundation
import Combine
class Model {
func getPublisher() -> AnyPublisher<String, Never> {
Just("Test")
.receive(on: DispatchQueue.main)
.eraseToAnyPublisher()
}
}
在这段代码中,一切都按预期工作。但是如果在文件 #3 中class Model
更改为struct Model
它会停止工作!
很奇怪,因为……好像没什么区别。
提示 #1
事实上,我们仍然从发布者那里得到消息。但是视图不会更新它。
提示 #2
如果我们稍微更改文件 #2 中的代码
private let publisher = Model().getPublisher()
func subsribe() {
subscription = publisher.sink { value in
self.content = value
}
}
它适用于两种情况(withclass
和 with struct
)
提示 #3(由于@Sweeper 的评论而编辑)
在文件 #2 中,如果我们将代码行private let model = Model()
移动到底部,如下所示:
class ViewModel: ObservableObject {
@Published var content: String = ""
var subscription: AnyCancellable?
private let model = Model()
func subsribe() {
subscription = model.getPublisher().sink { value in
self.content = value
}
}
}
代码开始工作!!!
其他人可以重现这种行为吗?
PS
链接原视频教程:视频
解决方案
推荐阅读
- android - 如何使用套接字将浮点数组发送到服务器
- algorithm - 如何在 dart-flutter 中对这样的时间列表进行排序 [ 2:00 AM , 10:00 AM , 6:00 PM ]?
- r - 我想在 R 中安装旧版本包
- react-native - 用于 tabBarLabel 的 React Navigation v5 更新本地化不起作用
- python - 如何使用包含字符串值的列表处理 Pandas 数据框列,获取唯一单词
- java - 当属性引用同一类时,如何将 DTO 转换为实体
- validation - Vuetify 数据表内联编辑验证
- css - 背景图像属性仅适用于 Firefox 浏览器
- django - Django Channels:当用户打开多个窗口时,group_send()在发送到活动窗口时被延迟
- javascript - 切换隐藏/显示双击问题