Словарь ключей вызова SWIFTUI не работает с ошибкой: 'Индекс индекса типа' () -> Bool 'в пути к ключу должен быть Hashable' - PullRequest
2 голосов
/ 03 апреля 2020

У меня есть это представление:

import SwiftUI

struct SectionView1: View {

    let dateStr:String    
    @Binding var isSectionView:Bool

    var body: some View {
        HStack {
            Button(action: {
                self.isSectionView.toggle()
            }) {
                Image(systemName: isSectionView ? "chevron.down.circle" : "chevron.right.circle")
            }
            Text("Media del \(dateStr)")
        }
    }
}

, которое будет вызываться из вида:

import SwiftUI
import Photos

struct MediaView: View {
    let geoFolder:GeoFolderCD

    @State private var assetsForDate = [String :[PHAsset]]()
    @State private var isSectionViewArray:[String:Bool] = [:]

    var body: some View {
        List {
            ForEach(assetsForDate.keys.sorted(by: > ), id: \.self) { dateStr in
                Section {
                    SectionView1(dateStr: dateStr,
                                 isSectionView: self.$isSectionViewArray[dateStr, default: true])
                }
            }
        }
        .onAppear {
            self.assetsForDate = FetchMediaUtility().fetchGeoFolderAssetsForDate(geoFolder: geoFolderStruct, numAssets: numMediaToFetch)
            for dateStr in self.assetsForDate.keys.sorted() {
                self.isSectionViewArray[dateStr] = true
            }
        }
    }
}    

, но у меня есть ошибка: Subscript index of type '() -> Bool' in a key path must be Hashable in isSectionView: self.$isSectionViewArray[dateStr, default: true]

Почему isSectionViewArray:[String:Bool] = [:] не имеет Hasbable?

Как изменить код для работы?

Если удалить, в SectionView, @Binding var isSectionView:Bool код работает нормально, или если Я установил, с SectionView, @Binding var isSectionViewArray:[String:Bool] = [:], код работает нормально.

1 Ответ

0 голосов
/ 03 апреля 2020

Вы можете написать свою собственную привязку с кодом ниже, и он должен работать

var body: some View {
        List {
            ForEach(assetsForDate.keys.sorted(by: > ), id: \.self) { dateStr in
                let value = Binding<Bool>(get: { () -> Bool in
                    return self.isSectionViewArray[dateStr, default: true]
                }) { (value) in

                }
                Section {
                    SectionView1(dateStr: dateStr,
                                 isSectionView: value)
                }
            }
        }
        .onAppear {
            self.assetsForDate = FetchMediaUtility().fetchGeoFolderAssetsForDate(geoFolder: geoFolderStruct, numAssets: numMediaToFetch)
            for dateStr in self.assetsForDate.keys.sorted() {
                self.isSectionViewArray[dateStr] = true
            }
        }
    }
...