【发布时间】:2021-05-07 08:34:21
【问题描述】:
当我尝试删除列表中的项目时,出现以下错误:
Swift/ContiguousArrayBuffer.swift:580:致命错误:索引超出范围 2021-05-07 09:59:38.171277+0200 Section[4462:220358] Swift/ContiguousArrayBuffer.swift:580:致命错误:索引超出范围
我一直在寻找解决方案,但我发现的所有解决方案似乎都不适用于我的代码。
FIY 这是我在 SwiftUI 或 Swift 中的第一个应用程序,所以我对此完全陌生。
所以如果有人可以帮助我并解释我需要改变什么以及为什么我会如此感激:)
这里有一些代码,希望能帮助你找到问题的根源。
我的模特:
//
// Item.swift
// Section
//
// Created by Niklas Peterson on 2021-03-11.
//
import Foundation
struct Item: Identifiable, Hashable, Codable {
var id = UUID().uuidString
var name: String
}
extension Item {
static func getAll() -> [Item] {
let key = UserDefaults.Keys.items.rawValue
guard let items: [Item] = UserDefaults.appGroup.getArray(forKey: key) else {
let items: [Item] = [.section1]
UserDefaults.appGroup.setArray(items, forKey: key)
return items
}
return items
}
static let section1: Item = {
return Item(name: "Section")
}()
}
extension Item {
static func fromId(_ id: String) -> Item? {
getAll().first { $0.id == id }
}
}
用户默认值:
//
// UserDefaults+Ext.swift
// Section
//
// Created by Niklas Peterson on 2021-03-11.
//
import Foundation
extension UserDefaults {
static let appGroup = UserDefaults(suiteName: "************ hidden ;) ")!
}
extension UserDefaults {
enum Keys: String {
case items
}
}
extension UserDefaults {
func setArray<Element>(_ array: [Element], forKey key: String) where Element: Encodable {
let data = try? JSONEncoder().encode(array)
set(data, forKey: key)
}
func getArray<Element>(forKey key: String) -> [Element]? where Element: Decodable {
guard let data = data(forKey: key) else { return nil }
return try? JSONDecoder().decode([Element].self, from: data)
}
}
内容视图:
//
// ContentView.swift
// Section
//
// Created by Niklas Peterson on 2021-03-11.
//
import SwiftUI
struct ContentView: View {
@State private var items = Item.getAll()
func saveItems() {
let key = UserDefaults.Keys.items.rawValue
UserDefaults.appGroup.setArray(items, forKey: key)
}
func move(from source: IndexSet, to destination: Int) {
items.move(fromOffsets: source, toOffset: destination)
saveItems()
}
func delete(at offsets: IndexSet) {
items.remove(atOffsets: offsets)
saveItems()
}
var body: some View {
NavigationView {
List {
ForEach(items.indices, id: \.self) { index in
TextField("", text: $items[index].name, onCommit: {
saveItems()
})
}
.onDelete(perform: delete)
.onMove(perform: move)
}
.toolbar {
ToolbarItemGroup(placement: .primaryAction) {
HStack {
Button(action: {
self.items.insert(Item(name: ""), at: 0)
}) {
Image(systemName: "plus.circle.fill")
}
EditButton()
}
}
}
.navigationBarTitle("Sections")
.listStyle(InsetGroupedListStyle())
}
}
}
【问题讨论】:
-
随便搜一下——原因和解决方法被贴了很多次
-
@asperi 我之前已经阅读过你对这个问题的其他问题的回答,但我似乎无法让它发挥作用。并且不完全理解我需要做什么才能使更改适合我的情况。我刚试过这个:stackoverflow.com/questions/66712572/… 但那也不管用我通常只做设计,但想学习如何在 SwiftUI 中编码 :)
标签: swiftui swiftui-list