在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和编程完全陌生),那么使用字典上的“元组”,甚至结构