在 NSUserDefaults 中保存一个元组
Save a tuple in NSUserDefaults
我正在使用一个元组来存储这样的东西。
var accessLavels: (hasInventoryAccess: Bool, hasPayrolAccess: Bool)
accessLavels = (hasInventoryAccess: true, hasPayrolAccess: false)
现在我想把它保存在NSUserDefaults
。
NSUserDefaults.standardUserDefaults().setValue(accessLavels, forKey: "AccessLevelKey")
NSUserDefaults.standardUserDefaults().synchronize()
但是我得到以下错误。
类型'(hasInventoryAccess: Bool, hasPayrolAccess: Bool)'不符合协议'AnyObject'
我该如何解决这个问题?如果不可能,那么欢迎任何其他保存元组的建议。
谢谢。
在文档中,我没有看到任何方法 -setValue
。
根据文档,NSUserDefaults 只能保存 NSString、NSNumber、NSData、NSDictionary、NSArray、NSData 和 NSDate。这是 link:
NSUserDefaults Class Reference.
所以,你不能在这里保存元组。 -setValue
来自 NSKeyValueCoding
协议。
You can store Bool, Float, Int, Object, Double or URL but not a Tuple. So you have two
options, save two only hasPayrolAccess and hasPayrolAccess Bool
values:
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)
Or save it using an Array of 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)
}
}
我遇到了类似的情况,试图用 NSCoder
对元组进行编码。我解决它的方法是手动将元组转换为 Dictionary
。这不是一个很好的解决方案,因为如果元组发生变化,则需要在多个地方更改键。
我的元组中有一个嵌套枚举,并为它提供了一个基本类型 (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)
我有一个包含 3 个值的元组。
以下代码用于保存元组。基本上,我从元组创建了一个字符串(组件用逗号分隔)。
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")
}
为了检索元组,我检索了字符串,将其分解为数组并使用该数组重新创建了一个元组。
let runwayDestString = defaultsLoad.stringForKey("RunwayDest")
if let runwayDestString = runwayDestString
{
let runwayDestArray = runwayDestString.componentsSeparatedByString(",")
appSingleton.runwayDestShared = (runwayDestArray[0],runwayDestArray[1],runwayDestArray[2])
}
我不是一岁的问题但仍然:
let accesLvl : [String:AnyObject] = ["hasInventoryAcces":true, "hasPayrolAccess":false]
NSUserDefaults.standardUserDefaults().setObject(accesLvl, forKey: "accesLevel")
如果您只保存布尔值,let accesLvl : [String:Bool]
是更好的选择。
万一我什么都不懂(我对 Swift 和编程还很陌生),使用 "tuple" 而不是字典或什至是结构
我正在使用一个元组来存储这样的东西。
var accessLavels: (hasInventoryAccess: Bool, hasPayrolAccess: Bool)
accessLavels = (hasInventoryAccess: true, hasPayrolAccess: false)
现在我想把它保存在NSUserDefaults
。
NSUserDefaults.standardUserDefaults().setValue(accessLavels, forKey: "AccessLevelKey")
NSUserDefaults.standardUserDefaults().synchronize()
但是我得到以下错误。
类型'(hasInventoryAccess: Bool, hasPayrolAccess: Bool)'不符合协议'AnyObject'
我该如何解决这个问题?如果不可能,那么欢迎任何其他保存元组的建议。
谢谢。
在文档中,我没有看到任何方法 -setValue
。
根据文档,NSUserDefaults 只能保存 NSString、NSNumber、NSData、NSDictionary、NSArray、NSData 和 NSDate。这是 link:
NSUserDefaults Class Reference.
所以,你不能在这里保存元组。 -setValue
来自 NSKeyValueCoding
协议。
You can store Bool, Float, Int, Object, Double or URL but not a Tuple. So you have two options, save two only hasPayrolAccess and hasPayrolAccess Bool values:
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)
Or save it using an Array of 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)
}
}
我遇到了类似的情况,试图用 NSCoder
对元组进行编码。我解决它的方法是手动将元组转换为 Dictionary
。这不是一个很好的解决方案,因为如果元组发生变化,则需要在多个地方更改键。
我的元组中有一个嵌套枚举,并为它提供了一个基本类型 (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)
我有一个包含 3 个值的元组。
以下代码用于保存元组。基本上,我从元组创建了一个字符串(组件用逗号分隔)。
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")
}
为了检索元组,我检索了字符串,将其分解为数组并使用该数组重新创建了一个元组。
let runwayDestString = defaultsLoad.stringForKey("RunwayDest")
if let runwayDestString = runwayDestString
{
let runwayDestArray = runwayDestString.componentsSeparatedByString(",")
appSingleton.runwayDestShared = (runwayDestArray[0],runwayDestArray[1],runwayDestArray[2])
}
我不是一岁的问题但仍然:
let accesLvl : [String:AnyObject] = ["hasInventoryAcces":true, "hasPayrolAccess":false]
NSUserDefaults.standardUserDefaults().setObject(accesLvl, forKey: "accesLevel")
如果您只保存布尔值,let accesLvl : [String:Bool]
是更好的选择。
万一我什么都不懂(我对 Swift 和编程还很陌生),使用 "tuple" 而不是字典或什至是结构