Swift NSUserDefaults setString: forKey :?

NSUserDefaults tiene integerForKey: setInteger:forKey: y stringForKey: pero no tiene setString:forKey:

¿Cómo configura una cadena en NSUserDefaults? Tiene setObject:forKey: pero, en Swift, String es una estructura. ¿Está bien usar setObject:forKey: para almacenar una cadena?

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

discusión

Como Swift String está puenteado a NSString, el uso de setObject es válido. Sin embargo, como los otros types mencionados no se aceptan en NSUserDefaults utilizando el setter setObject; tienen sus propios creadores de conveniencia.

conveniencia-inits

A pesar de esto, casi cualquier cosa que se pueda pensar se puede serializar y colocar en NSUserDefaults usando setObject con un argumento NSData (como se señala en otra parte en SO).

Actualización: Xcode 7.0.1 • Swift 2.0

 let myString = "Hello World" NSUserDefaults.standardUserDefaults().setObject(myString, forKey: "myString") if let myLoadedString = NSUserDefaults.standardUserDefaults().stringForKey("myString") { print(myLoadedString) // "Hello World" } 

Lo bueno de Swift es que le permite extender el idioma fácilmente. Puede crear su propio setString (forKey :), setDate (forKey :), etc … creando una extensión NSUserDefaults como sigue:

 extension NSUserDefaults { func setString(string:String, forKey:String) { setObject(string, forKey: forKey) } func setDate(date:NSDate, forKey:String) { setObject(date, forKey: forKey) } func dateForKey(string:String) -> NSDate? { return objectForKey(string) as? NSDate } } let name = "Chris Lattner" let address = "1 Infinite Loop, Cupertino, CA 95014, United States" let dob = NSCalendar(calendarIdentifier: NSCalendarIdentifierGregorian)!.dateWithEra(1, year: 1978, month: 1, day: 1, hour: 0, minute: 0, second: 0, nanosecond: 0)! NSUserDefaults().setString(name, forKey: "userName") NSUserDefaults().setString(address, forKey: "userAddress") NSUserDefaults().setDate(dob, forKey: "userDOB") let loadedUserName = NSUserDefaults.standardUserDefaults().stringForKey("userName") ?? "" let loadedUserAddress = NSUserDefaults.standardUserDefaults().stringForKey("userAddress") ?? "" let loadedUserDOB = NSUserDefaults.standardUserDefaults().dateForKey("userDOB") ?? NSDate.distantPast() print(loadedUserName) // "Chris Lattner" print(loadedUserAddress) // "1 Infinite Loop, Cupertino, CA 95014, United States" print(loadedUserDOB.descriptionWithLocale(NSLocale(localeIdentifier: "en_US"))) // "Sunday, January 1, 1978 at 12:00:00 

Swift 3 eliminado .setObject . Use .set en .set 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)") } 

Definitivamente puede utilizar setObject:forKey: el método NSDictionary o incluso setValue:forkey: que es un método KVC .

Funcionará bien.