SwiftUI ForEach循环内删除图片报类型不匹配错误如何解决
错误原因
你当前的ForEach遍历写法中,闭包内拿到的是SelectedMedia类型的实例,而非数组的Int类型下标,而removeItem(at:)方法要求传入Int类型的下标参数,因此出现类型不匹配的编译报错。
修复方案
推荐两种可直接落地的实现方式:
方案1:枚举数组下标与元素(更推荐)
直接遍历数组的下标+元素组合,拿到准确的下标传入删除方法,性能更高且不会出现重复元素删除错误的问题:
ScrollView(.horizontal) { HStack(spacing: 5) { // 枚举获取下标和对应的元素 ForEach(Array(self.selectedMedia.enumerated()), id: \.element) { index, media in ZStack { Image(uiImage: media.image) .resizable() .scaledToFit() .frame(width: UIScreen.main.bounds.width * 0.5) Button(action: { // 直接传入已获取的下标 removeItem(at: index) }, label: { Image(systemName: "trash") .padding(5) .foregroundColor(Color.red) .background(Color.white) }) } } } } // 原有删除方法无需修改 func removeItem(at index: Int) { self.selectedMedia.remove(at: index) }
方案2:通过元素匹配查找下标
如果不想调整ForEach的遍历逻辑,可以修改删除方法的参数类型,通过元素匹配找到对应下标后删除:
ScrollView(.horizontal) { HStack(spacing: 5) { ForEach(self.selectedMedia, id:\.self) { media in ZStack { Image(uiImage: media.image) .resizable() .scaledToFit() .frame(width: UIScreen.main.bounds.width * 0.5) Button(action: { // 传入当前选中的media实例 removeItem(media: media) }, label: { Image(systemName: "trash") .padding(5) .foregroundColor(Color.red) .background(Color.white) }) } } } } // 修改删除方法的参数类型 func removeItem(media: SelectedMedia) { // 匹配到对应元素的下标后删除 if let index = self.selectedMedia.firstIndex(of: media) { self.selectedMedia.remove(at: index) } }
注意:该方案依赖SelectedMedia实现的Hashable协议,如果数组中存在完全相同的SelectedMedia实例,可能会出现删除错位的问题,优先使用方案1。
内容的提问来源于stack exchange,提问作者LeXxyIT
相关产品推荐
相关产品推荐

