如何从json中删除可选文本结果迅速

时间:2019-09-02 15:51:20

标签: ios json swift codable

我正在使用newsApi从中获取新闻列表。我根据新闻的属性创建了模型,所有属性在模型中都是可选的,并且在我将其解析为打印到控制台以获取结果时进行解析,但是所有字段的数据都带有可选文本

我已经基于新闻api字段创建了三个结构,它们就像

struct GoogleNews: Codable {
   var status: String?
   var totalResults: Int?
   var articles: [Article]
  }

struct Article: Codable {
   var source: Source
   var author: String?
   var title: String?
   var description: String?
   var url: String?
   var urlToImage: String?
   var publishedAt: String?
  var content: String?
}

struct Source: Codable {
   var id: String?
   var name: String?
}

调用appi

URLSession.shared.dataTask(with: url) { (data, response, error) in
        guard let data = data else {return}

        do {
            let allNews = try JSONDecoder().decode(GoogleNews.self, from: data)
            print(allNews.articles[0])
        } catch let error {
            print(error.localizedDescription)
        }
    }.resume()

调用api后,结果所有字段的结果都带有可选文本

name: Optional("Venturebeat.com")), author: Optional("Dean Takahashi"), title: Optional("How Paymentwall’s Terminal3 lets game developers create their own online shops"), description: Optional("Paymentwall built a business as a global payments platform, with much of its focus on games. Last year, the company spun out its Terminal3 as a platform for monetizing and distributing games. Now it is making it easier for indie, small, and medium-size game c…")...ect

从结果中删除可选文本的解决方案是什么。

3 个答案:

答案 0 :(得分:0)

问题是您正在尝试打印一个所有属性均为可选的对象。即使您解开var results = days .GroupBy(d => d.Date.Year) .Select(y => new Year { YearNumber = y.Key, Months = y .GroupBy(d => d.Date.Month) .Select(m => new Month { MonthNumber = m.Key, Days = m.ToList() }) .ToList() }) .ToList(); ,也必须解开属性。您可以像这样解开可选项:

article

此外,您可以一次解开多个属性:

let article = allNews.articles[0] 
if let source = article.source {
    print(source)
}

答案 1 :(得分:0)

对于结构中的可选值,请确保它们是可选的,因为您确定在某些情况下不会返回值。如果您想拆开它们,则有两种方法。

第一种方法是使用 if-let语句,它看起来像这样:

if let name = allNews.articles[0].name {

}

在花括号内是使用变量 name 的地方,该变量不是您要询问的可选值,因为它已被包装。

您可以使用的第二种方法是 guard语句,如下所示:

guard let name = allNews.articles[0].name else { return }

在这种情况下, name 变量将被解包,并且可以在代码范围内的任何位置使用。但是,只有将其成功展开后,它才有效。如果不能,则将调用return语句并超出其范围。

答案 2 :(得分:0)

只需删除符号?从Struct成员声明的末尾变为:

let author: String