swift: не может получить элементы-сущности из coredata
Я новичок в программировании и недавно начал с swift (xcode 9.4.1, swift 4.x). Возможно, решение довольно простое, но я не понимаю. В интернете есть несколько похожих вопросов и ответов, но у них другой код, и я не знаю, как его адаптировать. Поэтому я хотел бы, чтобы вы мне помогли. Спасибо!
У меня есть iOS-приложение, которое сохраняет статистику в спорте. Я создал две сущности под названием Stat и Game. Сохранение работает с этим кодом:
@IBAction func saveButtonPressed(_ sender: UIButton) {
let context = (UIApplication.shared.delegate as! AppDelegate).persistentContainer.viewContext
let stats = Stat(context: context)
stats.action = action
stats.playerNumber = Int32(playerOfAction)
stats.points = Int32(pointsOfAction)
let statsMinute = Game(context: context)
statsMinute.minute = Int32(currentMinute)
(UIApplication.shared.delegate as! AppDelegate).saveContext()
Теперь я хочу получить и отобразить последнюю сохраненную статистику (и иметь возможность редактировать ее позже). Я пытаюсь это с этим кодом:
func lastStatInfo() {
let context = (UIApplication.shared.delegate as! AppDelegate).persistentContainer.viewContext
do {
let loadMin = try context.fetch(Game.fetchRequest()) as [Game]
lastStatMinuteLabel.text = "\(loadMin.minute)th minute"
} catch {
print("didn't load minute")
}
do {
let loadStat = try context.fetch(Stat.fetchRequest()) as [Stat]
lastStatActionLabel.text = loadStat.action
lastStatPlaylerLabel.text = "# \(loadStat.playerNumber)"
} catch {
print("didn't load stat")
}
}
Есть три ошибки, такие как 'Value of type '[Game]' has no member 'minute''.
Почему атрибуты недоступны? Я думаю, что это потому, что статистика хранится в виде массива. Как правильно получить данные?
Бонусный вопрос: я пробовал разные типы атрибутов моделей данных. Кажется, что для сохранения трикотажных номеров и точек работает только Int32. Можете ли вы сказать мне, почему и если это лучший способ их хранить?
1 ответ
Ваш запрос на выборку возвращает массив в качестве результата (даже если существует только один объект), поэтому вам нужно зациклить массив или получить только один из определенного индекса
for stat in loadMin {
var minute = stat.minute
//do stuff with minute
}
Или же
if !loadMin.isEmpty {
lastStatMinuteLabel.text = "\(loadMin[0].minute)th minute”
}
Я обычно использую только Int для целочисленных значений.