2015-03-18 14 views
14

NSUserDefaults ha integerForKey:, setInteger:forKey: e stringForKey:, ma non dispone di setString:forKey:.Swift NSUserDefaults setString: forKey :?

Come si imposta una stringa su NSUserDefaults? Ha setObject:forKey: ma, in Swift, String è una struttura. Va bene usare setObject:forKey: per memorizzare una stringa?

+0

setObjectForKey –

risposta

10

La ragione per cui setObject può essere utilizzato per applicare una stringa si trova nella discussione il riferimento:

discussion

Dal Swift String è colmato di NSString, l'utilizzo di setObject è valido. Tuttavia, poiché gli altri tipi citati non sono accettati in NSUserDefaults usando setter setObject; hanno i loro setter di convenienza.

convenience-inits

Nonostante questo, quasi tutto si può pensare può essere serializzato e messo in NSUserDefaults utilizzando setObject con un argomento NSData (come notato altrove su SO).

+0

Grazie per la risposta. Le altre risposte sono esatte e apprezzate, ma ho accettato questa risposta perché menziona la struttura di Swift String ponticellata alla classe NSString. Anche l'utilizzo di NSData è utile. –

4

È possibile utilizzare in modo definitivo il setObject:forKey:, il metodo NSDictionary o anche setValue:forkey: che è un metodo KVC.

Funzionerà perfettamente.

17

aggiornamento: 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" 
} 

La cosa bella di Swift è che permette a voi di estendere facilmente la lingua. È possibile creare il proprio setString (Forkey :), setDate (Forkey :), ecc ... la creazione di un'estensione NSUserDefaults come segue:

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 
14

Swift 3 rimosso .setObject. Utilizzare invece .set. Ad esempio:

// 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)") 
} 
+2

Breve e obiettivo. Grazie! –

+1

E riguardo il recupero del valore con defaults.string (forKey: "savedString")? Sembra funzionare. – RanLearns

+0

@RanLearns ottimo punto. Non sono sicuro del motivo per cui l'ho fatto in quel modo inizialmente. Modificato. –

Problemi correlati