Swift NSUserDefaults setString: forKey:?
NSUserDefaults имеет integerForKey:
, setInteger:forKey:
и stringForKey:
, но не имеет setString:forKey:
.
Как установить строку в NSUserDefaults? Он имеет setObject:forKey:
, но в Swift String является структурой. Можно ли использовать setObject:forKey:
для хранения строки?
Ответы
Ответ 1
Причина, по которой setObject может использоваться для применения строки, найдена при обсуждении ссылки:
![discussion]()
Так как строка Swift привязана к NSString, использование setObject является допустимым. Однако, поскольку другие типы, упомянутые, не принимаются в NSUserDefaults с помощью setObject setter; у них есть свои приспособления для удобства.
![convenience-inits]()
Несмотря на это, почти все, что можно подумать, можно сериализовать и поместить в NSUserDefaults, используя setObject с аргументом NSData (как указано в другом месте на SO).
Ответ 2
update: 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"
}
Хорошая вещь о Swift заключается в том, что она позволяет вам легко расширять язык. Вы можете создать свой собственный setString (forKey:), setDate (forKey:) и т.д.), Создавая расширение NSUserDefaults следующим образом:
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
Ответ 3
Swift 3 удален .setObject
. Вместо этого используйте .set
. Например:
// 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)")
}
Ответ 4
Вы можете использовать setObject:forKey:
, метод NSDictionary
или даже setValue:forkey:
, который является методом KVC
.
Все будет хорошо.