Swift Compact Map возвращается пустым - PullRequest
0 голосов
/ 24 июня 2018

Привет. Я пытаюсь изучить RXSwift, и впервые столкнулся с такими понятиями, как Карты и Компактные карты.

Я могу получить ответ, но эта строка всегда возвращается пустой.

objects.compactMap (DummyUser.init)

fileprivate let Users = Variable<[DummyUser]>([])
    fileprivate let bag = DisposeBag()



response
                .filter { response, _ in
                    return 200..<300 ~= response.statusCode
                }
                .map { _, data -> [[String: Any]] in
                    guard (try? JSONSerialization.jsonObject(with: data, options: [])) != nil  else {
                            return []
                    }

                    let json = try JSONSerialization.jsonObject(with: data, options: []) as? [String : Any]

                  //  print(json!["results"])
                    return json!["results"] as! [[String : Any]]
                }
                .filter { objects in
                    return objects.count > 0
                }
                .map { objects in
                  //  objects.forEach{print($0["name"]!)}
                    let names = objects.map { $0["name"]!}
                    print(names)
                    return objects.compactMap(DummyUser.init)
                }
                .subscribe(onNext: { [weak self] newEvents in
                    self?.processEvents(newEvents)
                })
                .disposed(by: bag)

func processEvents(_ newEvents: [DummyUser]) {
        var updatedEvents = newEvents + Users.value
        if updatedEvents.count > 50 {
            updatedEvents = Array<DummyUser>(updatedEvents.prefix(upTo: 50))
        }

        Users.value = updatedEvents
        DispatchQueue.main.async {
            self.MianUsertable.reloadData()
        }
     //   refreshControl?.endRefreshing()

        let eventsArray = updatedEvents.map{ $0.dictionary } as NSArray
        eventsArray.write(to: userFileURL, atomically: true)

    }

Мой ответ Json здесь

https://randomuser.me/api/?results=5

Класс DummyUser

import Foundation

typealias AnyDict = [String: Any]

class DummyUser {
    let gender: String
    let name: AnyDict
    let dob: String
    let picture: AnyDict

    init?(dictionary: AnyDict) {
        guard let Dgender = dictionary["gender"] as? String,
             let Dname = dictionary["name"] as? AnyDict,
             let birthdata = dictionary["dob"] as? AnyDict,
             let Ddob = birthdata["dob"] as? String,
             let Dpicture = dictionary["picture"] as? AnyDict
            else {
                return nil
        }

        gender = Dgender
        name = Dname
        dob = Ddob
        picture = Dpicture
    }



    var dictionary: AnyDict {
        return [
            "user": ["name" : name, "gender": gender, "dob": dob],
            "picture" : ["userImage": picture]
        ]
    }

}

1 Ответ

0 голосов
/ 24 июня 2018

В вашей модели DummyUser вы используете неисправный инициализатор, поэтому в случае неправильного словаря, предоставленного методу init, он вернет nil.

compactMap, автоматически автоматически фильтрует nil ивот почему ваш вывод пуст.

Глядя на этот фрагмент кода:

let names = objects.map { $0["name"]!}
return objects.compactMap(DummyUser.init)

Я бы отладил эту переменную с именем names, потому что она, вероятно, имеет неправильный ввод для DummyUser инициализатор.Это должен быть словарь, содержащий все ваши DummyUser параметры.Вы также можете отладить ваш неисправный инициализатор, чтобы увидеть, какой из параметров отсутствует.

...