SwiftUI绑定到计算属性?

时间:2020-02-20 06:45:29

标签: ios swift data-binding swiftui

我有两个类,一个是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甜美绑定一起使用。

2 个答案:

答案 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()
    }
}

是您所需要的。