【问题标题】:Swift Compact Map returning emptySwift Compact Map 返回空
【发布时间】:2018-06-24 07:49:26
【问题描述】:

您好,我正在尝试学习 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]
        ]
    }

}

【问题讨论】:

  • 看看这个 .. 让 Ddob =birthdata["dob"] as?字符串,听起来不对……可能你想约会或年龄

标签: ios iphone swift functional-programming rx-swift


【解决方案1】:

在您的 DummyUser 模型中,您使用的是可失败初始化程序,因此如果提供给 init 方法的字典错误,它将返回 nil

compactMap 自动过滤 nil 的,这就是你的输出为空的原因。

看这段代码:

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

我会调试这个名为names 的变量,因为它可能对DummyUser 初始化程序有错误的输入。它应该是包含所有DummyUser 参数的字典。您还可以调试您的可失败初始化程序以查看缺少哪个参数。

【讨论】:

    猜你喜欢
    • 2021-12-14
    • 1970-01-01
    • 2015-11-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-03-27
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多