将展开的值传递给 Text() 成功,但传递给 Link() 会导致“在展开可选值时意外发现 nil”
Posted
技术标签:
【中文标题】将展开的值传递给 Text() 成功,但传递给 Link() 会导致“在展开可选值时意外发现 nil”【英文标题】:Passing unwrapped values to Text() succeeds but to Link() results in "Unexpectedly found nil while unwrapping an Optional value" 【发布时间】:2021-03-16 01:34:47 【问题描述】:我正在解开 API 调用中的值以显示给用户。将这些值显示为Text()
有效,但是当我尝试使用Link()
显示字符串值时,我收到错误Unexpectedly found nil while unwrapping an Optional value
。
我相信这可能会发生,因为来自 API 调用的数据尚未写入result
,这是我存储来自我的 API 调用的结构化 json 数据的地方。但是仅当我尝试显示Link()
时才会出现此错误。当我将相同的确切路径传递给Text()
而不是Link()
时,没有错误。
我在我的 API 调用中使用DispatchQueue
和一个完成处理程序,我认为这应该允许 API 调用和数据写入在后台发生,我认为这将有助于避免此类错误。
struct ResultView: View
@State var result: NYTSearchResponse?
var body: some View
VStack
//These text results unwrap and display just fine
Text(result?.response.docs[0].headline.main ?? "")
Text(result?.response.docs[0].abstract ?? "")
Text(formatDate(from: result?.response.docs[0].pubDate ?? "")
// Error occurs on this line "Thread 1: Fatal error: Unexpectedly found nil while unwrapping an Optional value"
Link("Read Article", destination: URL(string: "\(result?.response.docs[0].webURL! ?? "")")!)
.onAppear
getData(from: formURL()) (result) in
self.result = result
使用完成处理程序和 DispatchQueue
的 API 调用
func getData(from url: String, completion: @escaping (NYTSearchResponse) -> ())
let task = URLSession.shared.dataTask(with: URL(string: url)!, completionHandler: data, response, error in
guard let data = data, error == nil else
print("Error loading data")
return
do
let result = try JSONDecoder().decode(NYTSearchResponse.self, from: data)
DispatchQueue.main.async
completion(result)
catch
print(error)
)
task.resume()
为什么这个错误只在我尝试形成链接时出现,我该如何解决这个问题?
【问题讨论】:
看起来问题出在强制展开webURL!
。您是否也尝试将其添加到 Text() 中?
@LuizDias Text() 有效。当我使用 Text(result?.response.docs[0].webURL ?? "") 时没有错误,并且 url 字符串显示正确。
嗯好吧我现在看到有几个!在那一行中,可能是使用 Xcode 建议的修复的结果。我很难保持所有元素的正确性。关于如何格式化行的任何提示?
好的,我已将该行更改为Link("Read Article", destination: URL(string: "\(result?.response.docs[0].webURL)") ?? "")
,现在我正在处理另一个错误Cannot convert value of type 'String' to expected argument type 'URL'
,即使webURL
在我的自定义对象定义中被定义为String?
类型跨度>
将字符串更新为Link("Read Article", destination: URL(string: (\result?.response.docs[0].webURL)) ?? "")
,现在在正文Failed to produce diagnostic for expression; please file a bug report
上出现一个奇怪的错误
【参考方案1】:
一个有效的解决方案保持强制展开,但在 alt 字符串中有文本
Link("Read article", destination: URL(string: result?.response.docs[0].webURL ?? "http://www.nytimes.com")!)
【讨论】:
以上是关于将展开的值传递给 Text() 成功,但传递给 Link() 会导致“在展开可选值时意外发现 nil”的主要内容,如果未能解决你的问题,请参考以下文章
如何从模型实例(具有来自 api 的值)传递数据并将其提供给 Text() 小部件
使用 CreateThreadpoolWork/SubmitThreadpoolWork 时将不同的值传递给回调函数