IOS/Objective-C:NSUserDefaults 的类型强制

IOS/Objective-C: Type Enforcement for NSUserDefaults

如果将整数保存为 NSUserDefault,是否可以将其作为字符串和数字检索?

//Set
[prefs setInteger:99 forKey:@"userid"];

//Get
NSNumber *useridnum =[[NSUserDefaults standardUserDefaults] valueForKey:@"userid"];//seems to work

NSString *userid =[[NSUserDefaults standardUserDefaults] valueForKey:@"userid"];//seems to work

我本以为不会,但除非我遗漏了什么,否则这似乎是可能的。

感谢您对此的任何澄清。

你的 userid 字符串实际上是一个 NSNumber,你只是在欺骗编译器并告诉它它是一个 NSString。如果您尝试调用 NSString 而不是 NSNumber 的方法,那么它将在运行时崩溃。

但是,您可以告诉用户默认值使用 stringForKey: 方法将值检索为字符串,即使您最初将值存储为 return 和 NSString一个整数。

NSString *userid = [[NSUserDefaults standardUserDefaults] stringForKey:@"userid"]; // actually a string

来自 Apple 文档:

Given a key that identifies an attribute or to-one relationship, return the attribute value or the related object. Given a key that identifies a to-many relationship, return an immutable array or an immutable set that contains all of the related objects.

- (nullable id)valueForKey:(NSString *)key;

[[NSUserDefaults standardUserDefaults] valueForKey:@"userid"] 将 return 一个 id 类型的变量。您可以将其分配给您想要的任何类型。如果你觉得这样不安全,你可以尝试转换成你想要的类型。