我正在使用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?
}
调用应用程序
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
从结果中删除可选文本的解决方案应该是什么。.
对于结构中的可选值,请确保它们是可选的,因为您确定在某些情况下不会返回值。如果您想解开它们,有两种方法可以做到这一点。
第一种方法是使用if-let 语句,它看起来像这样:
if let name = allNews.articles[0].name {
}
在大括号中,您将使用变量名称,它不是您询问的可选值,因为它已被解开包装。
您可以使用的第二种方法是guard 语句,如下所示:
guard let name = allNews.articles[0].name else { return }
在这种情况下,name变量将被解开包装,并且可以在代码范围内的任何位置使用。但是,它仅在可以成功解包时才有效。如果不能,则调用 return 语句并脱离它所在的任何范围。
问题是您正在尝试打印一个所有属性都是可选的对象。即使您解开了article
,您也必须解开属性的包装。您可以像这样解开您的可选包:
let article = allNews.articles[0]
if let source = article.source {
print(source)
}
您还可以一次解包多个属性:
if let source = article.source, let author = article.author, let title = article.title {
// do things
}
只需从 Struct 成员声明的末尾删除 ? 的符号,变成这样:
let author: String