Цель функции map()
состоит в том, чтобы перебрать элементы входного массива и применить функцию преобразования к каждому из этих элементов. Преобразованные элементы добавляются в новый выходной массив, который возвращается map()
. Важно понимать, что длина выходного массива равна длине входного массива.
Например:
let inputArray = ["red", "white", "blue"]
let outputArray = inputArray.map { $0.count } // outputArray is [3, 5, 4]
В вашем коде вы вызываете:
result.success().map { $0.informationList.notifications }
Я вообще не знаю RxSwift, поэтому я собираюсь вдаваться в дикие спекуляции.
Во-первых, я не знаю точно, что возвращает result.success()
, но тот факт, что выМожно вызвать map()
, это означает, что result.success()
возвращает массив (что странно, но хорошо, мы пойдем с ним).
Во-вторых, мы знаем, что массив, возвращаемый result.success()
, содержит элементы, которые имеютсвойство informationList
, а свойство informationList
имеет свойство с именем notifications
. Я предполагаю, что notifications
во множественном числе означает, что тип свойства notifications
является массивом, вероятно, [RTVNotification]
.
Итак, этот код:
result.success().map { $0.informationList.notifications }
Преобразует массив success()
в новый массив. Исходя из моего предположения, что notifications
относится к типу [RTVNotification]
, и, если предположить, что массив success()
содержит только один элемент, я ожидаю, что результат
result.success().map { $0.informationList.notifications }
Toбыть массивом типа [[RTVNotification]]
, то есть массивом с одним элементом, где этот элемент является массивом RTVNotification
s.
Затем вы передаете этот массив [[RTVNotification]]
в другую функцию map()
:
.map { NotificationItem.instantiate(with: $0) }
Напомним с самого начала этого ответа, что map()
перебирает элементы массивов. Поскольку входной массив для этой карты [[RTVNotification]]
, его элементы будут иметь тип [RTVNotification]
. Вот что означает $0
в вашем вызове - [RTVNotification]
. Но функция instantiate(with:)
принимает RTVNotification
, , а не массив RTVNotification
, поэтому вы получаете ошибку:
Невозможно преобразовать значение типа '[RTVNotification]'к ожидаемому типу аргумента' RTVNotification '
Так что вы можете сделать, чтобы это исправить?
Я бы, вероятно, сделал что-то подобное (вам придется адаптировать его для вашего использованияcase):
guard let successResponse = webService.request().success().first else {
print("no success response received")
return nil // basically report up an error here if not successful
}
// get the list of notifications, this will be type [RTVNotification]
let notifications = successResponse.informationList.notifications
// Now you can create an array of `[NotificationItem]` like you want:
let notificationItems = notifications.map { NotificationItem.instantiate(with: $0) }
// do something with notificationItems...
Предостережение к вышесказанному: если вам нужно перебирать каждый элемент массива success()
, то вы можете сделать это следующим образом:
let successResponses = webService.result().success()
// successNotifications is of type [[RTVNotification]]
let successNotifications = successResponses.map { $0.informationList.notifications }
// successItems will be of type [[NotificationItem]]
let successItems = successNotifications.map { notifications in
notifications.map { NotificationItem.instantiate(with: $0) }
}
Другими словами, в этом последнем случае вы получите массив, содержащий массивы NotificationItem
.