将响应NSArray转换为Object array swift3

时间:2016-12-12 14:05:20

标签: arrays json swift alamofire

您好我能从服务器获取阵列列表的响应。但我不知道如何在对象数组[Feed]中解析该响应并在完成处理程序上发送它。我的守则如下:

class FeedsService {

    private var feedsEndPoint: String = "https://jsonplaceholder.typicode.com/posts"

    public func getFeeds(completion: ([Feed]) -> Void) {
        Alamofire.request(feedsEndPoint, method: .get)
            .validate(statusCode: 200..<300)
            .validate(contentType: ["application/json"])
            .responseJSON{ response in
                print("Response \(response.result.value)")

        }
    }
}

Feed模型如下:

class Feed {
    private var title: String
    private var body: String

    init(title:String, body: String) {
        self.title = title
        self.body = body
    }

    public func getTitle() -> String {
        return self.title
    }

    public func getBody() -> String {
        return self.body;
    }
}

我想将其解析为Feed Array并在完成回调时发送它。 我正在使用Alamofire rest库从休息服务器加载数据。

1 个答案:

答案 0 :(得分:0)

你可以试试这个:

    class FeedsService {

    private var feedsEndPoint: String = "https://jsonplaceholder.typicode.com/posts"

    public func getFeeds(completion: @escaping ([Feed]) -> Void) {
        Alamofire.request(feedsEndPoint, method: .get)
            .validate(statusCode: 200..<300)
            .validate(contentType: ["application/json"])
            .responseJSON{ response in
                print("Response \(response.result.value)")
                var feeds = [Feed]()
                if let jsonArray = response.result.value as? [[String: Any]] {
                    for json in jsonArray {
                        if let feed = Feed(json: json) {
                            feeds.append(feed)
                        }
                    }
                    completion(feeds)
                } else {
                    // handle error
                }
        }
    }
}

此外,更新您的Feed类:

class Feed {
    private var title: String
    private var body: String

    init(title:String, body: String) {
        self.title = title
        self.body = body
    }

    init?(json: [String: Any]) {
        guard let title = json["title"] as? String,
            let body = json["body"] as? String else {
                return nil
        }
        self.title = title
        self.body = body
    }

    public func getTitle() -> String {
        return self.title
    }

    public func getBody() -> String {
        return self.body;
    }
}

只需将“title”和“body”更改为json响应中的相应键即可。

正如 El Tomato 指出Feed init无效,这是一个可以在游乐场试用的测试代码:

let testFeedJson = ["title": "Test Title", "body" : "Test Body"]
if let testFeed = Feed(json: testFeedJson) {
    print(testFeed.getTitle())
    print(testFeed.getBody())
}