将展开的值传递给 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() 小部件

php如何将变量的值传递给html

VBA TextBox将每行的值传递给单元格范围

使用 CreateThreadpoolWork/SubmitThreadpoolWork 时将不同的值传递给回调函数

为啥 getServerSideProps 没有将正确的值传递给组件 props?

将数组传递给函数 - 不同的值 - Segfault