Swift NSUserDefaults setString:forKey:?

Swift NSUserDefaults setString:forKey:?

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

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

您完全可以使用 setObject:forKey:NSDictionary 方法甚至 setValue:forkey:,这是一种 KVC 方法。

它会工作得很好。

更新: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

之所以可以用setObject来套用一个字符串,在参考文献的讨论中找到:

由于Swift String 桥接到NSString,setObject 的用法是有效的。但是,由于使用 setObject setter; 在 NSUserDefaults 中不接受提到的其他类型;他们有自己的方便 setters.

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

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)")
}