【问题标题】:Swift safe unwrapping optional a Class Constant without redundancySwift 安全展开可选的无冗余类常量
【发布时间】:2021-01-28 15:08:04
【问题描述】:

我正在尝试在我的代码中加入更多结构,所以我正在实现这个UserDefaultsService

class UserDefaultsService {
    
    let defaults = UserDefaults(suiteName: UserDefaults.Keys.groupKey)

    static let shared = UserDefaultsService()
    
    func updateDataSourceArrayWithWishlist(wishlist: Wishlist) {
        guard var dataSourceArray = defaults?.getDataSourceArray() else { return }
        if let index = dataSourceArray.firstIndex(where: ({$0.id == wishlist.id})) {
            dataSourceArray[index] = wishlist
            defaults?.setDataSourceArray(data: dataSourceArray)
        }
    }
    
    func getDataSourceArray() -> [Wishlist]? {
        return defaults?.getDataSourceArray()
    }
}

但正如您所见,defaults 是可选的。我知道我可以使用guard 安全地打开它,例如每次我使用它时,但有没有更好/更清洁的方法来做到这一点?我的想法是只打开一次,然后我可以在UserDefaultsService 的任何地方使用它。

【问题讨论】:

  • 您可以强制解包 (!),但通常我喜欢使用guard 有条件地解包或使用preconditionFailure 失败
  • @NewDev 这就是我想要的,但我不能在类变量中使用guard
  • 您可以使用计算属性。或者,您可以使用立即执行的闭包,即let default = { guard let ... }()

标签: ios swift variables unwrap swift-optionals


【解决方案1】:

在声明的末尾添加!

let defaults = UserDefaults(suiteName: UserDefaults.Keys.groupKey)!

【讨论】:

  • 但这可能会崩溃
  • ?但如果UserDefaults(suiteName: UserDefaults.Keys.groupKey) 为零?我强行打开它?为什么不能崩溃?
  • 如果不存在,上面的行将创建套件默认值,如果存在则链接到它这里没有崩溃只确保您有一个具有使用名称的组,以便在扩展中访问您的数据
  • 呵呵,我不知道..为什么它是可选的呢?不管怎样,你回答了。谢谢
  • 自己尝试一下,它不会因任何常量而崩溃
猜你喜欢
  • 2016-10-29
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多