2015-10-27 76 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

相關問題