在NSUserDefaults中保存一个元组

我正在使用一个元组来存储这样的东西。

var accessLavels: (hasInventoryAccess: Bool, hasPayrolAccess: Bool) accessLavels = (hasInventoryAccess: true, hasPayrolAccess: false) 

现在我想把它保存在NSUserDefaults

 NSUserDefaults.standardUserDefaults().setValue(accessLavels, forKey: "AccessLevelKey") NSUserDefaults.standardUserDefaults().synchronize() 

但是我得到以下错误。

types'(hasInventoryAccess:Bool,hasPayrolAccess:Bool)'不符合协议'AnyObject'

我该如何解决这个问题? 如果不可能的话,那么任何其他的build议来拯救元组是值得欢迎的。

谢谢。

我遇到了一个类似的情况,试图用NSCoder对一个元组进行编码。 我解决它的方法是通过手动将元组转换为Dictionary 。 这不是一个很好的解决scheme,因为如果元组发生了变化,密钥需要在几个地方进行更改。

我有一个嵌套在我的元组枚举,并给它一个基本types(string),我从中转换原始值。 这是一个额外的工作,但谢天谢地,你只是原始的。

 # SerializeableTuple.swift typealias AccessTuple = (hasInventoryAccess: Bool, hasPayrolAccess: Bool) typealias AccessDictionary = [String: Bool] let InventoryKey = "hasInventoryAccess" let PayrollKey = "hasPayrollAccess" func serializeTuple(tuple: AccessTuple) -> AccessDictionary { return [ InventoryKey : tuple.hasInventoryAccess, PayrollKey : tuple.hasPayrolAccess ] } func deserializeDictionary(dictionary: AccessDictionary) -> AccessTuple { return AccessTuple( dictionary[InventoryKey] as Bool!, dictionary[PayrollKey] as Bool! ) } 

 # Encoding / Decoding var accessLavels: AccessTuple = (hasInventoryAccess: true, hasPayrolAccess: false) // Writing to defaults let accessLevelDictionary = serializeTuple(accessLavels) NSUserDefaults.standardUserDefaults().setObject(accessLevelDictionary, forKey: "AccessLevelKey") // Reading from defaults let accessDic = NSUserDefaults.standardUserDefaults().dictionaryForKey("AccessLevelKey") as AccessDictionary let accessLev = deserializeDictionary(accessDic) 

我有一个三元组的元组。

以下代码用于保存元组。 基本上,我从元组中创build了一个string(用逗号分隔的组件)。

 let defaultsLoad = NSUserDefaults.standardUserDefaults() if appSingleton.runwayDestShared != nil { // Creating a String from the tuple let runwayDestString = appSingleton.runwayDestShared!.0 + "," + appSingleton.runwayDestShared!.1 + "," + appSingleton.runwayDestShared!.2 defaultsLoad.setObject(runwayDestString, forKey: "RunwayDest") } 

为了检索元组,我检索了string,把它分解成数组,并使用数组重新创build一个元组。

 let runwayDestString = defaultsLoad.stringForKey("RunwayDest") if let runwayDestString = runwayDestString { let runwayDestArray = runwayDestString.componentsSeparatedByString(",") appSingleton.runwayDestShared = (runwayDestArray[0],runwayDestArray[1],runwayDestArray[2]) } 

你可以存储Bool,Float,Int,Object,Double或URL,但不能是Tuple。 所以你有两个select,保存两个只有hasPayrolAccess和hasPayrolAccess布尔值:

 NSUserDefaults.standardUserDefaults().setBool(true, forKey: "hasInventoryAccess") NSUserDefaults.standardUserDefaults().setBool(false, forKey: "hasPayrolAccess") let hasInventoryAccess = NSUserDefaults.standardUserDefaults().boolForKey("hasInventoryAccess") println(hasInventoryAccess) let hasPayrolAccess = NSUserDefaults.standardUserDefaults().boolForKey("hasPayrolAccess") println(hasPayrolAccess) 

或者使用一个Bool数组来保存它:

 var accessLavels = [true,false] println(accessLavels) NSUserDefaults.standardUserDefaults().setValue(accessLavels, forKey: "accessLavels") if let loadAccessLavels = NSUserDefaults.standardUserDefaults().arrayForKey("accessLavels") as? [Bool] { if let hasInventoryAccess = loadAccessLavels.first { println(hasInventoryAccess) } if let hasPayrolAccess = loadAccessLavels.last { println(hasPayrolAccess) } } 

在文档中,我没有看到任何方法-setValue 。 基于文档, NSUserDefaults只能保存NSString,NSNumber,NSData,NSDictionary,NSArray,NSData和NSDate。 这里是链接: NSUserDefaults类参考。

所以,你不能在这里保存元组。 而-setValue来自NSKeyValueCoding协议。

我一岁的问题,但仍然:

  let accesLvl : [String:AnyObject] = ["hasInventoryAcces":true, "hasPayrolAccess":false] NSUserDefaults.standardUserDefaults().setObject(accesLvl, forKey: "accesLevel") 

如果你只保存let accesLvl : [String:Bool]let accesLvl : [String:Bool]是一个更好的select。

如果我没有得到什么东西(我对Swift和编程完全陌生),那么使用字典上的“元组”,甚至结构