use*_*888 71 nsuserdefaults swift xcode6
我需要创建一个数组来添加这种格式的对象,如Swift中的字典:["key1":"value1","key2":"value2"]
当我尝试保存它时,NSUserDefaults
一切都是正确的,但是当NSUserDefaults
用键读取时这会崩溃.我的var obj需要什么类型的数据?
let def = NSUserDefaults.standardUserDefaults()
var key = "keySave"
var element: AnyObject!
var array1: [AnyObject!] = []
array1.append(["key1": "val1", "key2": "val2"])
array1.append(["key1": "val1", "key2": "val2"])
//save
var savestring : [AnyObject!]
savestring = array1
var defaults = NSUserDefaults.standardUserDefaults()
defaults.setObject(savestring, forKey: key)
defaults.synchronize()
//read
var obj: [AnyObject!] = []
if(obj != nil){
print("size: ")
print(obj.count) //vary long value confused..
element = obj[0] //crash
print(element.objectForKey("key1"))
}
Run Code Online (Sandbox Code Playgroud)
Sur*_*gch 163
问题是"数组数组",但我想大多数人可能只是想知道如何保存数组UserDefaults
.对于那些人,我将添加一些常见的例子.
保存数组
let array = ["horse", "cow", "camel", "sheep", "goat"]
let defaults = UserDefaults.standard
defaults.set(array, forKey: "SavedStringArray")
Run Code Online (Sandbox Code Playgroud)
检索数组
let defaults = UserDefaults.standard
let myarray = defaults.stringArray(forKey: "SavedStringArray") ?? [String]()
Run Code Online (Sandbox Code Playgroud)
保存数组
let array = [15, 33, 36, 723, 77, 4]
let defaults = UserDefaults.standard
defaults.set(array, forKey: "SavedIntArray")
Run Code Online (Sandbox Code Playgroud)
检索数组
let defaults = UserDefaults.standard
let array = defaults.array(forKey: "SavedIntArray") as? [Int] ?? [Int]()
Run Code Online (Sandbox Code Playgroud)
保存数组
let array = [true, true, false, true, false]
let defaults = UserDefaults.standard
defaults.set(array, forKey: "SavedBoolArray")
Run Code Online (Sandbox Code Playgroud)
检索数组
let defaults = UserDefaults.standard
let array = defaults.array(forKey: "SavedBoolArray") as? [Bool] ?? [Bool]()
Run Code Online (Sandbox Code Playgroud)
保存数组
let array = [Date(), Date(), Date(), Date()]
let defaults = UserDefaults.standard
defaults.set(array, forKey: "SavedDateArray")
Run Code Online (Sandbox Code Playgroud)
检索数组
let defaults = UserDefaults.standard
let array = defaults.array(forKey: "SavedDateArray") as? [Date] ?? [Date]()
Run Code Online (Sandbox Code Playgroud)
自定义对象(以及对象数组)需要更多工作才能保存UserDefaults
.请参阅以下链接以了解如何执行此操作.
??
)允许您返回已保存的数组或空数组而不会崩溃.这意味着如果对象返回nil,则将??
使用运算符后面的值.Int
,Bool
和Date
.我也用它测试过Double
.据我所知,你可以保存在属性列表中的任何东西都可以这样工作.HpT*_*erm 16
只是为了补充@Zaph在评论中所说的内容.
我有同样的问题,因为知道,数组String
没有保存.尽管苹果桥梁类型,如字符串和NSString的,我是不是能救的数组[String]
既不的[AnyObject]
.
然而,一系列的[NSString]
作品对我而言.
所以你的代码看起来像这样:
var key = "keySave"
var array1: [NSString] = [NSString]()
array1.append("value 1")
array1.append("value 2")
//save
var defaults = NSUserDefaults.standardUserDefaults()
defaults.setObject(array1, forKey: key)
defaults.synchronize()
//read
if let testArray : AnyObject? = defaults.objectForKey(key) {
var readArray : [NSString] = testArray! as [NSString]
}
Run Code Online (Sandbox Code Playgroud)
请注意,我创建了一个NSString数组而不是字典.我没有检查它是否适用于字典,但可能你必须定义[NSString : NSString]
使它工作的东西.
编辑
你正在谈论重新阅读你的问题和你的头衔array of array
.我认为,只要你坚持下去NSString
,一个数组就可以了.但是,如果您认为我的答案无关紧要,请在评论中告诉我,我会将其删除.
Zor*_*ayr 11
下面是一个读取和编写SNStock
实现类型对象列表的示例NSCoding
- 我们有一个整个列表的访问器watchlist
,以及两个添加和删除对象的方法,即addStock(stock: SNStock)
和removeStock(stock: SNStock)
.
import Foundation
class DWWatchlistController {
private let kNSUserDefaultsWatchlistKey: String = "dw_watchlist_key"
private let userDefaults: NSUserDefaults
private(set) var watchlist:[SNStock] {
get {
if let watchlistData : AnyObject = userDefaults.objectForKey(kNSUserDefaultsWatchlistKey) {
if let watchlist : AnyObject = NSKeyedUnarchiver.unarchiveObjectWithData(watchlistData as! NSData) {
return watchlist as! [SNStock]
}
}
return []
}
set(watchlist) {
let watchlistData = NSKeyedArchiver.archivedDataWithRootObject(watchlist)
userDefaults.setObject(watchlistData, forKey: kNSUserDefaultsWatchlistKey)
userDefaults.synchronize()
}
}
init() {
userDefaults = NSUserDefaults.standardUserDefaults()
}
func addStock(stock: SNStock) {
var watchlist = self.watchlist
watchlist.append(stock)
self.watchlist = watchlist
}
func removeStock(stock: SNStock) {
var watchlist = self.watchlist
if let index = find(watchlist, stock) {
watchlist.removeAtIndex(index)
self.watchlist = watchlist
}
}
}
Run Code Online (Sandbox Code Playgroud)
请记住,您的对象需要实现NSCoding
,否则编码将无法正常工作.这是SNStock
看起来像:
import Foundation
class SNStock: NSObject, NSCoding
{
let ticker: NSString
let name: NSString
init(ticker: NSString, name: NSString)
{
self.ticker = ticker
self.name = name
}
//MARK: NSCoding
required init(coder aDecoder: NSCoder) {
self.ticker = aDecoder.decodeObjectForKey("ticker") as! NSString
self.name = aDecoder.decodeObjectForKey("name") as! NSString
}
func encodeWithCoder(aCoder: NSCoder) {
aCoder.encodeObject(ticker, forKey: "ticker")
aCoder.encodeObject(name, forKey: "name")
}
//MARK: NSObjectProtocol
override func isEqual(object: AnyObject?) -> Bool {
if let object = object as? SNStock {
return self.ticker == object.ticker &&
self.name == object.name
} else {
return false
}
}
override var hash: Int {
return ticker.hashValue
}
}
Run Code Online (Sandbox Code Playgroud)
希望这可以帮助!
斯威夫特4.0
店铺:
let arrayFruit = ["Apple","Banana","Orange","Grapes","Watermelon"]
//store in user default
UserDefaults.standard.set(arrayFruit, forKey: "arrayFruit")
Run Code Online (Sandbox Code Playgroud)
拿来:
if let arr = UserDefaults.standard.array(forKey: "arrayFruit") as? [String]{
print(arr)
}
Run Code Online (Sandbox Code Playgroud)
小智 5
这是:
var array : [String] = ["One", "Two", "Three"]
let userDefault = UserDefaults.standard
// set
userDefault.set(array, forKey: "array")
// retrieve
if let fetchArray = userDefault.array(forKey: "array") as? [String] {
// code
}
Run Code Online (Sandbox Code Playgroud)
归档时间: |
|
查看次数: |
81193 次 |
最近记录: |