我有两个类,一个是ContentView,它显示我的数据源中的信息。数据源是我的CharacterRepository。
我现在正在努力确保我的CharacterRepository内始终有一个排序列表。
这是我到目前为止的代码:
class CharacterRepository: ObservableObject {
@Published public var characters = [Character(name: "Nott the Brave",
initiative: 23,
isActive: false),
Character(name: "Caduceus Clay",
initiative: 2,
isActive: false),
...]
...
}
和
struct InitiativeTrackerScreen: View {
@EnvironmentObject var characterRepository: CharacterRepository
var body: some View {
NavigationView {
VStack {
List {
ForEach(characterRepository.characters) { entry in
CharacterListElement(character: entry)
}
...
现在,我打算使用的方法将类似于将characters变量转换为计算属性,该属性每次执行get时都会运行“ sorted by”功能。不幸的是,在SwiftUI中尚不可能绑定到计算属性(不确定,会发生吗?)。
有人可以帮我吗?我不想回到每次更改时重新排序和重绘的旧方法。这不是为什么我将SwiftUI与ist甜美绑定一起使用。
答案 0 :(得分:2)
我认为对属性getter中的数据进行排序可能没有必要的开销。
简单的(和注重性能的)解决方案是在数据更改时对其进行排序,然后更新Dictionary<string, string> refreshInterval = new Dictionary<string, string>()
{
{ "EventCounterIntervalSec", "1" }
};
非计算属性并绑定到该属性:
@Published
如果您希望以牺牲性能为代价来做到这一点,那么可以手动创建Binding
-类似这样的内容:
class CharacterRepository: ObservableObject {
func updateCharacters(_ characters: [Character]) {
self.characters = characters.sorted() // or whatever sorting strategy you need...
}
@Published public var characters = [Character(name: "Nott the Brave",
initiative: 23,
isActive: false),
Character(name: "Caduceus Clay",
initiative: 2,
isActive: false),
...]
...
}
答案 1 :(得分:1)
我喜欢按相关问题回答。您需要什么绑定到计算属性?
class CharacterRepository: ObservableObject {
@Published public var characters = [Character(name: "Nott the Brave",
initiative: 23,
isActive: false),
Character(name: "Caduceus Clay",
initiative: 2,
isActive: false),
...]
...
var sorted: [Character] {
characters.sorted()
}
}
是您所需要的。