我正在使用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
从结果中删除可选文本的解决方案是什么。
答案 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