SwiftData: добавление UUID в существующую модель всегда создает тот же идентификаторIOS

Программируем под IOS
Ответить Пред. темаСлед. тема
Anonymous
 SwiftData: добавление UUID в существующую модель всегда создает тот же идентификатор

Сообщение Anonymous »

У меня возникла проблема с обновлением модели SwiftData путем добавления свойства.

В частности, у меня есть следующая модель, и я пытаюсь обновить ее, добавив идентификатор. Проблема в том, что если я это сделаю, все записи, уже хранящиеся в приложении, обновятся с тем же UUID. Очевидно, я хотел бы иметь разные идентификаторы для каждого экземпляра. Я что-то упускаю? Стоит ли мне сделать что-то по-другому?
Word model
В предыдущей версии модель не имела свойства id, соответствующего ключа кодирования и атрибута в инициализаторе.

@Model
class Word: Codable {
enum CodingKeys: CodingKey {
case id, term, learntOn, notes, category, bookmarked
}

var id: UUID = UUID() // marked it as var for testing
let term: String = ""
let learntOn: Date = Date.now
var notes: String = ""
@Relationship(inverse: \Category.words) var category: Category?
var bookmarked: Bool = false

init(id: UUID, term: String, learntOn: Date, notes: String = "", category: Category? = nil, bookmarked: Bool = false) {
self.id = id
self.term = term
self.learntOn = learntOn
self.notes = notes
self.category = category
self.bookmarked = bookmarked
}

required init(from decoder: Decoder) throws {
let container = try decoder.container(keyedBy: CodingKeys.self)
self.id = try container.decode(UUID.self, forKey: .id)
self.term = try container.decode(String.self, forKey: .term)
let learntOn = try container.decode(String.self, forKey: .learntOn)
self.learntOn = try Date(learntOn, strategy: .iso8601)
self.notes = try container.decode(String.self, forKey: .notes)
self.category = try container.decode(Category?.self, forKey: .category)
self.bookmarked = try container.decode(Bool.self, forKey: .bookmarked)
}

func encode(to encoder: Encoder) throws {
var container = encoder.container(keyedBy: CodingKeys.self)
try container.encode(self.id, forKey: .id)
try container.encode(self.term, forKey: .term)
try container.encode(self.learntOn, forKey: .learntOn)
try container.encode(self.notes, forKey: .notes)
try container.encode(self.category, forKey: .category)
try container.encode(self.bookmarked, forKey: .bookmarked)
}

static func decodeWords(from json: String) throws -> [Word] {
let data = json.data(using: .utf8)!
let decoder = JSONDecoder()
decoder.dateDecodingStrategy = .iso8601
return try decoder.decode([Word].self, from: data)
}

static let example = Word(id: UUID(), term: "Swift", learntOn: .now, notes: "A swift testing word.", bookmarked: true)


Подробнее здесь: https://stackoverflow.com/questions/792 ... he-same-id
Реклама
Ответить Пред. темаСлед. тема

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

  • Похожие темы
    Ответы
    Просмотры
    Последнее сообщение

Вернуться в «IOS»