【问题标题】:Crash when getting value from shared Userdefaults从共享 Userdefaults 获取值时崩溃
【发布时间】:2021-03-25 16:18:04
【问题描述】:

我使用共享的 Userdefaults 将值从父 iOS 应用程序获取到 iOS14 Widget 扩展。 一切似乎都正常,我从未见过崩溃,不确定小部件是否会崩溃,但是,崩溃分析说:

Swift 运行时失败:在展开光学值时意外发现 nil。

该行是我从共享 Userdefault 中获取我的值的地方,所以最后一行来自以下代码:

struct QuitSmokingWidgetEntryView : View {
var entry: Provider.Entry

let myString:String = UserDefaults(suiteName: "group.com.xxx.xxx.widgetsharing")?.value(forKey: "myKey") as! String

正如我所说,一切似乎都可以正常工作而不会崩溃,但是 Xcode 崩溃分析告诉我该行发生了许多崩溃,我做错了什么?如何解决?

感谢您的帮助!

【问题讨论】:

  • 您强制将值 value(forKey: "myKey") as! String 转换为字符串,如果 .value 返回 nil 或返回的不是字符串必然会崩溃,为什么不使用 if letguard let 来安全展开
  • 如果我在 Xcode 之前放 let 说:一行上的连续声明必须用 ';' 分隔如果我按下修复它看起来像---如果;让 myString:String = UserDefaults(suiteName: --- 这显然不起作用
  • if let myString = UserDefaults(suiteName: "group.com.xxx.xxx.widgetsharing")?.value(forKey: "myKey") as? String { //your code to use myString here }怎么样
  • 感谢您的回答,Xcode 不会让我在之前放 if 或 guard,我用谷歌搜索了 - 可能是因为它没有功能?
  • 它是 SwiftIUI,以前从未使用过,对它来说真的很新,它是一个结构,我使用那行代码的 EntryView...

标签: swift swiftui crash widget nsuserdefaults


【解决方案1】:

当使用 ! 强制解包时,如果值为 nil(或使用 as!,如果转换失败),您总是会面临崩溃的风险。

在这种情况下,您可以这样做:

let myString:String = UserDefaults(suiteName: "group.com.xxx.xxx.widgetsharing")?.string(forKey: "myKey") ?? "Default value"

使用string(forKey:) 可以避免强制转换为String,然后如果在UserDefaults 中找不到任何值,则使用nil 合并?? 可以提供默认值。

【讨论】:

  • 感谢您的帮助,我会试一试,看看崩溃分析怎么说...
  • 我怎样才能对日期而不是字符串做同样的事情?
  • 让 myDate:Date = UserDefaults(suiteName: "group.com.xxx.xxx.widgetsharing")?.value(forKey: "myDateWidget") 为!日期
  • 让 myDate:Date = UserDefaults(suiteName: "group.com.xxx.xxx.widgetsharing")?.value(forKey: "myDateWidget") ??日期()
  • let myDate:Date = UserDefaults(suiteName: "group.com.xxx.xxx.widgetsharing")?.value(forKey: "myDateWidget") as? Date ?? Date()
猜你喜欢
  • 2015-03-03
  • 2020-06-27
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-02-16
相关资源
最近更新 更多