2015-10-27 51 views
1

我将一组字符串(Set<String>)存储到NSUserDefaults.standardUserDefaults()中,并且在取回对象时,它将返回为字符串数组而不是集合。NSUserDefaults返回swift数组[String]而不是集合<String>

此块的工作,因为我重新创建数组作为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内部设置为数组吗?有没有办法接收作为一个集合而不是一个数组的项目?

+2

根据文档,用户默认对象必须是实例或NSData的,的NSString,的NSNumber,NSDate的,NSArray中,或NSDictionary中的组合。你是如何存储* Set *的? –

+0

将NSData中的任何内容和检索类型转换为最初转换后的任何内容 –

+2

'NSUserDefaults.standardUserDefaults().setObject(Set([“a”,“b”]),forKey:“products”)'throws a运行时异常。没有看到你如何*设置*默认值是不可能给(有帮助)的答案。 –

回答

5

简短回答:否

NSUserDefaults不能存储集合。它是这样记录的,这是因为用于将数据存储在磁盘上的格式的限制。

如果保存一套适用于您并自动将其转换为数组,您确实很幸运,因为我不认为这是一种记录的行为,应该只是抛出一个错误。
编辑:它不工作,你不应该尝试它。

最佳做法是在保存之前将其转换为数组,并在检索之后将其转换回集。你也可以在NSUserDefaults上写一个自动完成的类别。下面是与目标-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 
+1

如上所述,保存一个集合不工作,并且不会*自动转换为一个数组。 –

+0

@MartinR编辑我的答案。这也是我的想法。 – deadbeef

相关问题