2015-03-18 24 views
14

NSUserDefaults ma integerForKey:, setInteger:forKey: i stringForKey:, ale nie ma setString:forKey:.Swift NSUserDefaults setString: forKey :?

Jak ustawić ciąg znaków dla NSUserDefaults? Ma on wartość setObject:forKey:, ale w Swift String jest strukturą. Czy można używać ciągu setObject:forKey: do przechowywania ciągu znaków?

+0

setObjectForKey –

Odpowiedz

10

Powodem że setObject mogą być wykorzystane do zastosowania ciąg znajduje się w omówienie odniesienie:

discussion

od Swift łańcucha jest zmostkowany do NSString, korzystanie z setObject jest prawidłowy. Jednak, ponieważ inne wymienione typy nie są akceptowane w NSUserDefaults przy użyciu setObject setter; mają własne selektory wygody.

convenience-inits

Niezależnie od tego, prawie wszystko można myśleć może być szeregowane i umieszcza w NSUserDefaults korzystających setObject z argumentem NSData (jak wspomniano gdzie indziej na SO).

+0

Dziękuję za odpowiedź. Pozostałe odpowiedzi są dokładne i doceniane, ale przyjmuję tę odpowiedź, aby zaakceptować, ponieważ wspomina o strukturze Swift String połączonej z klasą NSString. Użyteczne jest również użycie NSData. –

4

Można definitywnie użyć metody setObject:forKey:, NSDictionary lub nawet setValue:forkey:, która jest metodą KVC.

Będzie działało dobrze.

17

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

Zaletą Swift jest to, że pozwala na łatwe dostarczanie język. Można tworzyć własne setString (forKey :) setDate (forKey :) itd ... tworząc przedłużenie NSUserDefaults następujące:

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 usunięty .setObject. Zamiast tego użyj .set. Na przykład:

// 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

Krótkie i obiektywne. Dzięki! –

+1

Co powiesz na pobieranie wartości za pomocą defaults.string (forKey: "savedString")? To wydaje się działać. – RanLearns

+0

@RanLifens świetny punkt. Nie wiem, dlaczego to zrobiłem na początku. Edytowane. –

Powiązane problemy