如何快速创建一组两种类型?

Posted

技术标签:

【中文标题】如何快速创建一组两种类型?【英文标题】:How to create a set of two types in swift? 【发布时间】:2020-06-22 10:56:27 【问题描述】:

我是 Swift 和 SwiftUI 的新手。 我有两个结构:

struct SongModel: Identifiable, Hashable 
    let id: Int
    var path: String
    var artist: String
    var title: String
    var genre: String
    var sample_rate: Int
    var bitrate: Int
    var duration: Int
    var cover: String
    var remaining: Int?
    var created_at: String
    var filename: String
    var file_size: Int64

第二个:

struct FolderModel: Identifiable, Hashable 
    let id: Int
    var parent_id: Int?
    var name: String
    var files_quantity: Int
    var duration: Int
    var folder_size: Int64
    var created_at: String
    var files: [SongModel] = []

我还有一个列表来展示给定模型的数组:

List(selection: self.$selectKeeper) 
                    ForEach(self.filemanager.folders, id: \.self)  folder in
                        FolderItemView(folder: folder)
                            .environmentObject(self.filemanager.appSettings)
                            .listRowBackground(Color.white)
                            .onTapGesture(count: 2) 
                                withAnimation 
                                    self.filemanager.openFolder(folder: folder)
                                
                            
                    .onDelete(perform: self.onDelete)
                    ForEach(self.filemanager.files, id: \.self)  file in
                        FileItemView(file: file)
                            .environmentObject(self.filemanager.appSettings)
                            .listRowBackground(Color.white)
                    .onDelete(perform: self.onDelete)
                
                .environment(\.editMode, .constant(.active))

我想选择这些对象,所以我创建了一个 selectKeeper 属性。 我只能选择文件夹/文件

@State var selectKeeper = Set<SongModel>()

@State var selectKeeper = Set<FolderModel>()

但是当我尝试时

@State var selectKeeper = Set<AnyHashable>()

代码编译成功,但选择不起作用。我可以设置一个复选标记,但几秒钟后它消失了,我的 selectKeeper 变量为空。 如何设置 SongModel 和 FolderModel?

【问题讨论】:

你可以将 em 包裹在一个符合 Hashable 的枚举中 【参考方案1】:

你的方法几乎奏效了。我也使用了 Set。您只需要在 List 中添加一个 ForEach 即可。

struct ContentView: View 
    @State var selectKeeper : Set<AnyHashable>? = Set<AnyHashable>()
            
    var set : Set<AnyHashable>
    
    init()
    
        self.set = Set<AnyHashable>()
        
        self.set.insert(SongModel(id: 23, path: "Test", artist: "Test", title: "Test", genre: "Test", sample_rate: 123, bitrate: 123, duration: 123, cover: "Test", remaining: 123, created_at: "Test", filename: "Test", file_size: 123))
        
        self.set.insert(FolderModel(id: 1232, name: "Test", files_quantity: 2, duration: 2, folder_size: 23, created_at: "2020"))
    

    var body: some View 
        List(selection: $selectKeeper) 
            ForEach(Array(self.set), id: \.self)  item in
                HStack
                
                    if (item is SongModel)
                    
                        //Item is SongModel
                        Text(String((item as! SongModel).id))
                    
                    else
                    
                        //Item is FolderModel, better to check object type again  here
                    
                
            
        
    

我正在使用两个不同的对象在 init 方法中创建一个示例 Set。它们将被添加到集合中。您只需使用一个 ForEach,然后在内部检查它是否是 SongModelFolderModel 类的对象。

【讨论】:

谢谢!这么简单=)

以上是关于如何快速创建一组两种类型?的主要内容,如果未能解决你的问题,请参考以下文章

如何快速创建一组用户默认值?

我想了解为啥要创建一种类型来处理 Go 中的错误以及您如何决定它应该具有啥基础类型

matlab一次性创建一堆变量

如何使用 SQLAlchemy 只创建一张表?

Mysql 如何创建一张临时表

如何创建一条可靠的实时数据流