【问题标题】:Swift NSUserDefaults setString:forKey:?Swift NSUserDefaults setString:forKey:?
【发布时间】:2015-03-18 15:55:49
【问题描述】:

NSUserDefaults 有integerForKey:setInteger:forKey:stringForKey:,但没有setString:forKey:

如何将字符串设置为 NSUserDefaults?它有 setObject:forKey: 但是,在 Swift 中,String 是一个结构。使用setObject:forKey:存储字符串可以吗?

【问题讨论】:

    标签: ios swift nsuserdefaults


    【解决方案1】:

    更新:Xcode 13.2.1 • Swift 5.5.2

    let string = "Hello World"
    
    UserDefaults.standard.set(string, forKey: "string")
    
    if let loadedString = UserDefaults.standard.string(forKey: "string") {
        print(loadedString) // "Hello World"
    }
    

    Swift 的好处在于它允许您轻松地扩展语言。您可以创建自己的 date(forKey:) 扩展 UserDefaults 以创建实例方法,如下所示:

    extension UserDefaults {
        func date(forKey defaultName:String) -> Date? {
            object(forKey: defaultName) as? Date
        }
    }
    

    let userName = "Chris Lattner"
    let userAddress = "1 Infinite Loop, Cupertino, CA 95014, United States"
    let userDOB = DateComponents(calendar: .init(identifier: .gregorian), year: 1978).date!
    
    UserDefaults().set(userName, forKey: "userName")
    UserDefaults().set(userAddress, forKey: "userAddress")
    UserDefaults().set(userDOB, forKey: "userDOB")
    
    let loadedUserName = UserDefaults.standard.string(forKey: "userName")
    let loadedUserAddress = UserDefaults.standard.string(forKey: "userAddress")
    let loadedUserDOB = UserDefaults.standard.date(forKey: "userDOB")
    
    print(loadedUserName ?? "nil")    // "Chris Lattner"
    print(loadedUserAddress ?? "nil") // "1 Infinite Loop, Cupertino, CA 95014, United States"
    print(loadedUserDOB?.description(with: .init(identifier: "en_US")) ?? "nil")  // "Sunday, January 1, 1978 at 12:00:00
    

    【讨论】:

      【解决方案2】:

      setObject可用于应用字符串的原因在参考文献的讨论中找到:

      由于 Swift String 被桥接到 NSString,所以 setObject 的使用是有效的。但是,由于使用 setObject 设置器的 NSUserDefaults 不接受提到的其他类型;他们有自己的便利设置者。

      尽管如此,几乎任何可以想到的东西都可以使用带有 NSData 参数的 setObject 序列化并放入 NSUserDefaults(如 SO 中其他地方所述)。

      【讨论】:

      • 感谢您的回答。其他答案是准确和赞赏的,但我接受了这个答案,因为它提到了桥接到 NSString 类的 Swift String 结构。 NSData 的使用也很有帮助。
      【解决方案3】:

      Swift 3 删除了 .setObject。请改用.set。例如:

      // Create UserDefaults
      let defaults = UserDefaults.standard
      
      // Save String value to UserDefaults
      // Using defaults.set(value: Any?, forKey: String)
      defaults.set("Some string you want to save", forKey: "savedString")
      
      // Get the String from UserDefaults
      if let myString = defaults.string(forKey: "savedString") {
          print("defaults savedString: \(myString)")
      }
      

      【讨论】:

      • 简短而客观。谢谢!
      • 用 defaults.string(forKey: "savedString") 检索值怎么样?这似乎行得通。
      • @RanLearns 很重要。不知道为什么我一开始就那样做。已编辑。
      【解决方案4】:

      您绝对可以使用setObject:forKey:NSDictionary 方法,甚至可以使用setValue:forkey:KVC 方法)。

      它会工作得很好。

      【讨论】:

        猜你喜欢
        • 2015-08-30
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2017-01-04
        • 2014-10-05
        相关资源
        最近更新 更多