如何快速创建一组两种类型?
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,然后在内部检查它是否是 SongModel
或 FolderModel
类的对象。
【讨论】:
谢谢!这么简单=)以上是关于如何快速创建一组两种类型?的主要内容,如果未能解决你的问题,请参考以下文章