Swift NSUserDefaults setString:forKey:?
NSUserDefaults tiene y integerForKey:
, pero no tiene .setInteger:forKey:
stringForKey:
setString:forKey:
¿Cómo se configura una cadena en NSUserDefaults? Lo ha hecho setObject:forKey:
pero, en Swift, String es una estructura. ¿Está bien usarlo setObject:forKey:
para almacenar una cadena?
actualización: 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"
}
Lo bueno de Swift es que te permite ampliar fácilmente el lenguaje. Puede crear su propia date(forKey:)
extensión UserDefaults
para crear un método de instancia de la siguiente manera:
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.standard.set(userName, forKey: "userName")
UserDefaults.standard.set(userAddress, forKey: "userAddress")
UserDefaults.standard.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
Swift 3 eliminado .setObject
. Úselo .set
en su lugar. Por ejemplo:
// 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)")
}
La razón por la que setObject se puede utilizar para aplicar una cadena se encuentra en la discusión de la referencia:
Dado que Swift String está conectado a NSString, el uso de setObject es válido. Sin embargo, como los otros tipos mencionados no se aceptan en NSUserDefaults utilizando el configurador setObject; Tienen sus propios configuradores de conveniencia.
A pesar de esto, casi cualquier cosa que se pueda imaginar se puede serializar y colocar en NSUserDefaults usando setObject con un argumento NSData (como se indica en otra parte de SO).
Definitivamente puedes usar setObject:forKey:
el NSDictionary
método o incluso setValue:forkey:
cuál es un KVC
método.
Funcionará bien.