You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

SwiftUI 如何基于UUID删除macOS端列表及对应数组中的元素

第一步:修复ID类型不兼容问题

你的代码目前存在类型冲突:NoteItem 声明的id为Int类型,但你选中状态存储、新增笔记时都使用了UUID类型,先统一ID类型:

struct NoteItem: Codable, Hashable, Identifiable {
    // 将原有Int类型改为UUID
    let id: UUID
    var text: String
    var date = Date()
    // 补充dateFormatter定义,避免运行报错
    private var dateFormatter: DateFormatter {
        let formatter = DateFormatter()
        formatter.locale = Locale(identifier: "en_US_POSIX")
        return formatter
    }
    var dateText: String {
        dateFormatter.dateFormat = "EEEE, MMM d yyyy, h:mm a"
        return dateFormatter.string(from: date)
    }
    var tags: [String] = []
}

第二步:实现基于UUID的删除逻辑

不需要拿到完整的选中对象,直接用存储的selectedNoteId匹配数组元素即可,修改removeNote实现:

func removeNote() {
    // 先判断是否有选中的ID,再匹配数组中对应ID的元素下标
    guard let selectedId = selectedNoteId,
          let index = data.notes.firstIndex(where: { $0.id == selectedId }) else { return }
    print("delete item: \(index)")
    data.notes.remove(at: index)
}

第三步:绑定删除按钮点击事件

将工具栏中的删除按钮点击事件和上面的方法绑定,还可以增加无选中时的禁用逻辑优化体验:

ToolbarItem(placement: .automatic) {
    Button(action: removeNote) {
        Image(systemName: "trash")
    }
    // 无选中笔记时禁用删除按钮
    .disabled(selectedNoteId == nil)
}

修改完成后即可实现基于UUID的列表条目删除,逻辑底层是通过firstIndex(where:)遍历数组匹配UUID一致的元素,拿到下标后直接删除数组对应位置的数据。

内容的提问来源于stack exchange,提问作者Aleph

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.07 09:54:03