AppSettings
是一个简单的工具,允许自动将对象序列化和反序列化到NSDictionary
,并通过NSUserDefaults
进行读写。最初是为了简单地管理NSUserDefaults
中的应用设置而创建的。
当您想要将自定义对象持久化到例如NSUserDefaults
时,您必须使用NSCoding
和NSKeyedArchiver
来序列化它。这并不困难,但很耗时,Xcode也没有通过生成一些默认编码和解码方法存根来使这个过程更容易。当您必须手动序列化所有属性时,这变得非常痛苦。
另一方面,使用模型对象来配置您的应用设置,而不是只在NSUserDefaults
的键下写值,是非常方便的。您可以使用代码补全,编译器在您输入拼写错误时警告您,而且您不需要记住自定义字典中的所有键字符串。
那么为什么不编写一个序列化器,将具有属性的自定义对象转换为NSDictionary
并将其存储在类名键下呢?AppSettings
正是这样做的!:)
您需要做的事情只是创建自己的类,从AppSettings
继承。您想保存的字段必须在您的.h
文件中以属性(@property
)的形式声明,就像在其他对象中一样。当您完成并进行对象准备就绪后,您调用save
以持久化您的对象。当您想要加载之前保存的对象时,您调用- (id)load
,它返回AppSettings
子类的实例。就这样!:)
AppSettings
继承#import "AppSettings.h"
#import "MyNestedSettings.h"
@interface MySettings : AppSettings
@property (nonatomic, strong) NSDate *exampleDate;
@property (nonatomic, strong) NSString *exampleString;
@property (nonatomic, strong) NSNumber *exampleNumber;
@property (nonatomic, assign) int exampleInt;
@property (nonatomic, assign) BOOL exampleBool;
@end
MySettings *mySettings = [[MySettings alloc] init];
mySettings.exampleDate = [NSDate date];
[mySettings save];
MySettings *mySettings = [MySettings load];
您的设置在MySettings
键下保存,并且看起来像这样
MySettings = {
exampleBool = 1;
exampleDate = "2013-12-08 11:26:56 +0000";
exampleInt = 456;
exampleNumber = 123;
exampleString = "Example string \U0105\U0119\U015b\U0107";
};
您可以在AppSettings
类中实现的接口中尝试其他方法
- (id)initWithDictionary:(NSDictionary*)dictionaryOfPropertiesAndValues;
- (NSArray*)propertiesNames;
- (NSDictionary*)dictionaryOfPropertiesAndValues;
- (BOOL)save;
- (BOOL)saveUnderKey:(NSString*)mainKey;
+ (id)load;
+ (id)loadFromKey:(NSString*)mainKey;
例如,您可以提取属性和值的字典并自行处理,或者在不同键下保存设置。
您还可以查看AppSettingsTests.m
文件,查看每个方法是如何操作的。
是的,您可以拥有嵌套对象。只需将它们也声明为 AppSettings
的子类,并在您的设置主类中使用作为属性。请参阅测试部分中的 MySettings.h
和 MyNestedSettings.h
文件。
#import "AppSettings.h"
#import "MyNestedSettings.h"
@interface MySettings : AppSettings
@property (nonatomic, strong) NSDate *exampleDate;
@property (nonatomic, strong) NSString *exampleString;
@property (nonatomic, strong) NSNumber *exampleNumber;
@property (nonatomic, assign) int exampleInt;
@property (nonatomic, assign) BOOL exampleBool;
@property (nonatomic, strong) MyNestedSettings *myNestedSettings;
@end
#import "AppSettings.h"
@interface MyNestedSettings : AppSettings
@property (nonatomic, strong) NSString *nestedSettingsString;
@end
您保存的具有嵌套对象的设置现在看起来类似这样
MySettings = {
exampleBool = 1;
exampleDate = "2013-12-08 11:26:56 +0000";
exampleInt = 456;
exampleNumber = 123;
exampleString = "Example string \U0105\U0119\U015b\U0107";
myNestedSettings = {
nestedSettingsString = "nested example string";
};
};
<objc/runtime.h>
来提取属性信息,并使用 KVC
来设置和获取它们的值。AppSettings
在 MIT 许可下可用。更多信息请参阅 LICENSE 文件。