NSUserDefaults返回swift数组[String]而不是Set <string>

时间:2015-10-27 18:52:29

标签: ios swift nsuserdefaults

我将一组字符串(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 
   }

}

然而,不可能直接将对象作为快速集合来获取:

if let products = NSUserDefaults.standardUserDefaults().objectForKey("products") as? Set<String> {
   // will not cast into Set<String>
}

我假设NSUserDefaults内部隐藏了一个数组?有没有办法接收作为集合而不是数组的项目?

1 个答案:

答案 0 :(得分:8)

简答:否

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