Передать значения из одного массива в другой, используя RxSwift

swift

#1

Всем привет!
Есть два типа данных - Response и ViewModel

struct Response: Mappable {
let shoppingList: [ShoppingList]?
}

struct ShoppingList: Mappable {
let name: String?
let offers: [Offer]?
}

struct Offer: Mappable {
let price: String?
}

и

struct ViewModel {
let name: String?
let offersViewModel: [OffersViewModel]?
}


struct OffersViewModel {
let fullPrice: String?
}

Мне необходимо создать массив ViewModel, в котором будут лежать данные из Response. Как это реализовать, используя RxSwift? Либо же, стандартными средствами Swift.


#2

Не совсем понял что нужно получить.


#3
let response = BehaviorRelay(value: Response(shoppingList: []))
let viewModels = response.map {
    $0.shoppingList?.map { ViewModel(name: $0.name, offersViewModel: []) } ?? []
}

#4

Раз такая пляска)))

можно втиснуться, только что подумал, можно ли как-то переопределять операцию присваивания, чтобы коплитишен блоку присваивать обсервер!?

или сделать универсальное расширение, колбека к rx!?


#5

Боже, до меня дошло, что хотел автор.
Только теперь вопрос, для чего тут RxSwift? Стрельба из пушки по воробьям?


#6

Это в рамках изучения RxSwift :slight_smile:


#7

Хм,

$0.shoppingList?.map { ViewModel(name: $0.name - name у меня не показывается. Пишет, что Value of type ‘[PurchaseList.Fetch.ShoppingList]’ has no member ‘name’.


#8

В StackOverFlow предложили так -

func example(_ from: Observable<Response?>) -> Observable<[ViewModel]?> {
    return from
        .map { $0?.shoppingList ?? [] }
        .map { $0.map{ $0.map(ViewModel.init) } }
}

extension ViewModel {
    init(_ shoppingList: ShoppingList) {
        name = shoppingList.name
        offers = shoppingList.offers?.map { ViewModelOffers(fullPrice: $0.fullPrice) }
    }
}

Но, у меня теперь в Offers есть все элементы, а вот на уровень выше, где есть name, там только одно значение.