NSUserDefaults returns swift 数组 [String] 而不是 Set<String>
NSUserDefaults returns swift array [String] instead of Set<String>
我正在将一组字符串 (Set<String>
) 存储到 NSUserDefaults.standardUserDefaults()
中,当检索对象时,它返回为字符串数组而不是集合。
这个块有效,因为我将数组重新创建为 NSSet
if let products = NSUserDefaults.standardUserDefaults().objectForKey("products") as? [String] {
// recreate the array into a NSSet / Set
if let productSet = NSSet(array: products) as? Set<NSObject> {
// now it's a set
}
}
但是,无法直接将对象作为 swift 集合获取:
if let products = NSUserDefaults.standardUserDefaults().objectForKey("products") as? Set<String> {
// will not cast into Set<String>
}
我假设 NSUserDefaults
隐蔽设置在内部数组中?有没有办法以集合而不是数组的形式接收项目?
简答:否
NSUserDefaults
无法存储集合。它以这种方式记录,这是因为用于在磁盘上存储数据的格式的限制。
如果保存集合对您有效并自动将其转换为数组,那么您实际上很幸运,因为我不认为这是记录在案的行为,它应该会引发错误。
编辑:它不起作用,您不应该尝试。
最佳做法是在保存前将其转换为数组,并在检索后将其转换回集合。您还可以在 NSUserDefaults
上编写一个自动执行此操作的类别。这是 objective-C 的示例:
//
// NSUserDefaults+SetAdditions.h
//
#import <Foundation/Foundation.h>
@interface NSUserDefaults (SetAdditions)
- (NSSet *)setForKey:(NSString *)defaultName;
- (void)setSet:(NSSet *)set forKey:(NSString *)defaultName;
@end
//
// NSUserDefaults+SetAdditions.m
//
#import "NSUserDefaults+SetAdditions.h"
@implementation NSUserDefaults (SetAdditions)
- (NSSet *)setForKey:(NSString *)defaultName
{
NSArray *array = [self arrayForKey:defaultName];
if (array) {
return [NSSet setWithArray:array];
} else {
return nil;
}
}
- (void)setSet:(NSSet *)set forKey:(NSString *)defaultName
{
if (set) {
[self setObject:[set allObjects] forKey:defaultName];
} else {
[self setObject:nil forKey:defaultName];
}
}
@end
我正在将一组字符串 (Set<String>
) 存储到 NSUserDefaults.standardUserDefaults()
中,当检索对象时,它返回为字符串数组而不是集合。
这个块有效,因为我将数组重新创建为 NSSet
if let products = NSUserDefaults.standardUserDefaults().objectForKey("products") as? [String] {
// recreate the array into a NSSet / Set
if let productSet = NSSet(array: products) as? Set<NSObject> {
// now it's a set
}
}
但是,无法直接将对象作为 swift 集合获取:
if let products = NSUserDefaults.standardUserDefaults().objectForKey("products") as? Set<String> {
// will not cast into Set<String>
}
我假设 NSUserDefaults
隐蔽设置在内部数组中?有没有办法以集合而不是数组的形式接收项目?
简答:否
NSUserDefaults
无法存储集合。它以这种方式记录,这是因为用于在磁盘上存储数据的格式的限制。
如果保存集合对您有效并自动将其转换为数组,那么您实际上很幸运,因为我不认为这是记录在案的行为,它应该会引发错误。
编辑:它不起作用,您不应该尝试。
最佳做法是在保存前将其转换为数组,并在检索后将其转换回集合。您还可以在 NSUserDefaults
上编写一个自动执行此操作的类别。这是 objective-C 的示例:
//
// NSUserDefaults+SetAdditions.h
//
#import <Foundation/Foundation.h>
@interface NSUserDefaults (SetAdditions)
- (NSSet *)setForKey:(NSString *)defaultName;
- (void)setSet:(NSSet *)set forKey:(NSString *)defaultName;
@end
//
// NSUserDefaults+SetAdditions.m
//
#import "NSUserDefaults+SetAdditions.h"
@implementation NSUserDefaults (SetAdditions)
- (NSSet *)setForKey:(NSString *)defaultName
{
NSArray *array = [self arrayForKey:defaultName];
if (array) {
return [NSSet setWithArray:array];
} else {
return nil;
}
}
- (void)setSet:(NSSet *)set forKey:(NSString *)defaultName
{
if (set) {
[self setObject:[set allObjects] forKey:defaultName];
} else {
[self setObject:nil forKey:defaultName];
}
}
@end