#ios #swift
#iOS #быстрый
Вопрос:
Я хочу отправить post-запрос в свой API, но у меня возникли некоторые проблемы с отображением.
Пользователь запускает VCA и видит список пользователей, который извлекается с помощью запроса GET, пользователь может нажать на ячейку и просмотреть подробности (VCB). в VCB вы можете снова нажать на ячейку, и вы получите лист действий, который обновит этот статус на доступный или недоступный. Проблема, с которой я столкнулся, заключается в заполнении массива dailyInjuryStatus в запросе POST.
Получить модель запроса:
struct DailyInjuryIllnessPlayer: Hashable, Codable {
var playerId: Int
var playerName: String?
var numberOfStatusMissingDays: Int
var entries: [Entry]
func hash(into hasher: inout Hasher) {
hasher.combine(playerId)
}
static func == (lhs: DailyInjuryIllnessPlayer, rhs: DailyInjuryIllnessPlayer) -> Bool {
return lhs.playerId == rhs.playerId
}
}
struct Entry: Codable {
var injuryIllnessId: Int
var injuryIllnessName: String?
var statusDate: Date
var modifiedBy: String?
var status: String?
var playerStatusId: Int
var parentEventId: Int?
}
Модель для сообщения
struct CreateDailyInjuryIllnessNote: Encodable {
var teamId: UInt32
var dailyInjuryIllnessStatus: [DailyInjuryIllnessStatus]
}
struct DailyInjuryIllnessStatus: Encodable {
var iIeventId: UInt32
var effectiveDate: Date
var eventStatusId: UInt32
var playerId: UInt32
}
Код, который я использую для запроса (извлечение значений с экрана для отправки в API):
private extension DailyInjuryIllnessAPI.Model.Request.CreateDailyInjuryIllnessNote {
static func from(playerId: Int?, statusNote: DailyInjuryIllnessPlayer) -> Self? {
guard let playerId = playerId else { return nil }
let teamId = getTeamId(from: statusNote)
// Here is the issue, I can populate teamId, but I cannot populate dailyInjuryIllnessStatus.
return .init(teamId: UInt32(teamId), dailyInjuryIllnessStatus: <#T##[DailyInjuryIllnessAPI.Model.Request.DailyInjuryIllnessStatus]#>)
}
private static func getTeamId(from model: DailyInjuryIllnessPlayer) -> Int {
let answer = model.playerId
return answer
}
private static func getEventId(from model: DailyInjuryIllnessPlayer) -> Int {
var answer = 1
for eventId in model.entries {
answer = eventId.injuryIllnessId
}
return answer
}
private static func getEffectiveDate(from model: DailyInjuryIllnessPlayer) -> Date {
var answer = Date()
for date in model.entries {
answer = date.statusDate
}
return answer
}
private static func getEventStatusId(from model: DailyInjuryIllnessPlayer) -> Int {
var answer = 1
for statusId in model.entries {
answer = statusId.playerStatusId
}
return answer
}
private static func getPlayerId(from model: DailyInjuryIllnessPlayer) -> Int {
var answer = model.playerId
return answer
}
}
Проблема, как указано в коде, заключается в return .init
том, что Swift ожидает, что она будет похожа на модель, которая имеет TeamID и массив DailyInjuryIllnessStatus
. Как я могу поместить методы, которые я использовал для извлечения этих значений, в массив
Комментарии:
1. Откуда
DailyInjuryIllnessStatus
должен взяться массив данных? Кстати, циклы в других статических методах кажутся бессмысленными. Всегда возвращается последний элемент цикла, потому что возвращаемое значение перезаписывается.2. @vadian массив поступает из API. Это то, как я структурировал API .. есть ли лучший способ выполнить цикл
3. В данный момент, например
getEffectiveDate
, делает то же самое, что иreturn model.entries.last?.statusDate ?? Date()
4. да,
getEffectiveDate
должен вернуть StatusDate5. Похоже, ты не понимаешь.
model.entries
представляет собой массив с несколькими элементами, каждый элемент содержит astatusDate
. Какой из них вы хотите использовать? В коде используется последний вариант, мое предложение — это оптимизированная версия вашего кода.