如何在xcode 8中的对象中引用数组中的对象?

时间:2017-06-06 00:35:15

标签: ios arrays json swift object

我希望尝试引用所有"标题"在xcode 8中的这个json(link here)中。问题是在我可以提取标题数据之前需要引用(我相信)的对象和数组,我不是确定如何做到这一点。

到目前为止,这就是我所拥有的:

func fetchFeed(){
    let urlRequest = URLRequest(url: URL(string: "http://itunes.apple.com/us/rss/topalbums/limit=10/json")!)

    let task = URLSession.shared.dataTask(with: urlRequest) { (data,response,error) in

        if error != nil {
            print(error)
            return
        }

        self.artists = [Artist]()
        do {
            let json = try JSONSerialization.jsonObject(with: data!, options: .mutableContainers) as! [String : AnyObject]

            if let feedFromJson = json["feed"]?["entry"] as? [[String : AnyObject]] {
                for feedFromJson in feedsFromJson {
                    let feed = Feed()
                    if let entry = feedFromJson["entry"] as? String, let author = feedFromJson["domain"] as? String {

                        feed.entry = entry

                        article.headline = title

                    }
                    self.articles?.append(article)
                }
            }
            DispatchQueue.main.async {
                self.tableview.reloadData()

并提前感谢您的帮助!

2 个答案:

答案 0 :(得分:0)

  1. 有两种标题。 “饲料”和“进入”。
  2.   

    如果让entry = feedFromJson [“entry”]为?字符串,让author = feedFromJson [“domain”]为?字符串{

    iOS的做法不是这个。

    feedFromJson [“entry”] 是nil,而不是字符串。我猜你试图获得“饲料”标题。

    if let entry = (json["feed"] as Dictionary)?["title"]
    

    获得“入围”标题。只需遍历数组,即可获得标题。

    let titleDict = feedFromJson["title"] as? Dictionary
    let title = titleDict["title"] as? String
    article.headline = title
    
    1. 更好地了解JSON数据的结构。
    2. 太快了。

        

      如果让feedFromJson = json [“feed”]?[“entry”]为? [[String:   AnyObject]] {

      你应该一步一步。

      if let feedFromJson = (json["feed"] as Dictionary)?["entry"] as? [[String : AnyObject]] {
      

答案 1 :(得分:0)

我正在努力尝试了解您的需求。如果你想获得一个Article数组,其中headline是条目的标题标签,这就是我欺骗它的方式。

func articles(from json: Any?) -> [Article] {
    guard let json = json as? NSDictionary, let entries = json.value(forKeyPath: "feed.entry") as? [NSDictionary] else {
        return []
    }

    return entries.flatMap { entry in
        guard let title = entry.value(forKeyPath: "title.label") as? String else {
            return nil
        }

        var article = Article()
        article.headline = title
        return article
    }
}

你这样称呼它

self.articles = articles(from: json)

NSDictionary的方法value(forKeyPath:)接近魔法。调用json.value(forKeyPath: "feed.entry")会返回一组字典。每个字典都是json中的"entry"对象。接下来,我将每个条目映射到调用entry.value(forKeyPath: "title.label"),后者返回一个字符串。

如果这不仅仅是一个快速解决方案,那么我会考虑将SwiftyJSON添加到您的项目中。

func articles(from json: Any?) -> [Article] {
    return JSON(json)["feed"]["entry"].arrayValue.flatMap { entry in
        guard let title = entry["title"]["label"].string else {
            return nil
        }

        var article = Article()
        article.headline = title
        return article
    }
}
相关问题