Swift NSUserDefaults setString:forKey:?

Resuelto Yoichi Tagaya asked hace 54 años • 4 respuestas

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?

Yoichi Tagaya avatar Jan 01 '70 08:01 Yoichi Tagaya
Aceptado

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 UserDefaultspara 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
Leo Dabus avatar Mar 18 '2015 16:03 Leo Dabus

Swift 3 eliminado .setObject. Úselo .seten 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)")
}
Daniel Storm avatar Oct 16 '2016 15:10 Daniel Storm

La razón por la que setObject se puede utilizar para aplicar una cadena se encuentra en la discusión de la referencia:

discusión

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.

inicios 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).

Tommie C. avatar Mar 18 '2015 16:03 Tommie C.

Definitivamente puedes usar setObject:forKey:el NSDictionarymétodo o incluso setValue:forkey:cuál es un KVCmétodo.

Funcionará bien.

Gil Sand avatar Mar 18 '2015 15:03 Gil Sand