gpt4 book ai didi

快速组合 : turn a publisher into a read-only CurrentValueSubject

转载 作者:行者123 更新时间:2023-12-01 21:39:47 26 4
gpt4 key购买 nike

有时我的 View 模型使用@Published 属性或PassthroughSubject,但我不希望它对外界可写。很简单,把它变成一个公共(public)的 AnyPublisher 并保持可写的私有(private),就像这样:

class ViewModel {
@Published private var _models = ["hello", "world"]

var models: AnyPublisher<[String], Never> {
return $_models.eraseToAnyPublisher()
}
}

let viewModel = ViewModel()
viewModel.models.sink { print($0) }

但是如果您也希望能够“按需”读取值怎么办?例如对于这种情况:

extension ViewController: UICollectionViewDelegate {
func collectionView(_ collectionView: UICollectionView, didSelectItemAt indexPath: IndexPath) {
print(viewModel.models[indexPath.row])
}
}

显然,上面的代码是行不通的。

我考虑过使用 CurrentValueSubject,但它的值也是可写的,而且我很难将 Publisher 转换为 CurrentValueSubject。

我目前的解决方案是在 View 模型上添加类似这样的内容:

class ViewModel {
@Published private var _models = ["hello", "world"]
@Published var selectedIndex: Int?

var models: AnyPublisher<[String], Never> {
return $_models.eraseToAnyPublisher()
}

var selectedModel: AnyPublisher<String, Never> {
return models.combineLatest($selectedIndex.compactMap { $0 }).map { value, index in
value[index]
}.eraseToAnyPublisher()
}
}

let viewModel = ViewModel()
viewModel.models.sink { print($0) }

viewModel.selectedModel.sink { print($0) }
viewModel.selectedIndex = 1

但是添加selectedIndex 属性,selectedModel 发布者,设置selectedIndex 并订阅发布者是一件很麻烦的事..都是因为我想成为能够读取 viewModel.models 的当前值(并且不可写)。

有更好的解决方案吗?

最佳答案

为什么不直接将 @Published 属性公开,同时将其 setter 设为私有(private)?这应该完全符合您的要求,同时还能使您的代码保持最少和干净。

class ViewModel {
@Published public private(set) var models = ["hello", "world"]
}

let viewModel = ViewModel()
viewModel.$models.sink { print($0) }

关于快速组合 : turn a publisher into a read-only CurrentValueSubject,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/61520841/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com