[swift] 신속하게 NSUserdefaults에서 배열 배열을 저장하고 읽는 방법은 무엇입니까?
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"))
}
답변
질문은 “배열 배열”이라고 읽지 만 대부분의 사람들이 배열을 UserDefaults
. 그런 사람들을 위해 몇 가지 일반적인 예를 추가하겠습니다.
문자열 배열
어레이 저장
let array = ["horse", "cow", "camel", "sheep", "goat"]
let defaults = UserDefaults.standard
defaults.set(array, forKey: "SavedStringArray")
어레이 검색
let defaults = UserDefaults.standard
let myarray = defaults.stringArray(forKey: "SavedStringArray") ?? [String]()
Int 배열
어레이 저장
let array = [15, 33, 36, 723, 77, 4]
let defaults = UserDefaults.standard
defaults.set(array, forKey: "SavedIntArray")
어레이 검색
let defaults = UserDefaults.standard
let array = defaults.array(forKey: "SavedIntArray") as? [Int] ?? [Int]()
부울 배열
어레이 저장
let array = [true, true, false, true, false]
let defaults = UserDefaults.standard
defaults.set(array, forKey: "SavedBoolArray")
어레이 검색
let defaults = UserDefaults.standard
let array = defaults.array(forKey: "SavedBoolArray") as? [Bool] ?? [Bool]()
날짜 배열
어레이 저장
let array = [Date(), Date(), Date(), Date()]
let defaults = UserDefaults.standard
defaults.set(array, forKey: "SavedDateArray")
어레이 검색
let defaults = UserDefaults.standard
let array = defaults.array(forKey: "SavedDateArray") as? [Date] ?? [Date]()
객체 배열
사용자 지정 개체 (및 결과적으로 개체 배열)에 저장하는 데 약간 더 많은 작업이 필요합니다 UserDefaults
. 이를 수행하는 방법은 다음 링크를 참조하십시오.
메모
- nil 병합 연산자 (
??
)를 사용하면 충돌없이 저장된 배열 또는 빈 배열을 반환 할 수 있습니다. 즉, 객체가 nil을 반환하면??
연산자 다음의 값이 대신 사용됩니다. - 당신이 볼 수 있듯이, 기본 설정은 대한 동일
Int
,Bool
그리고Date
. 나는 또한 그것을Double
. 내가 아는 한, 속성 목록에 저장할 수있는 모든 것은 이와 같이 작동합니다.
답변
@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]
}
사전이 아닌 NSString 배열을 만들었습니다. 사전과 함께 작동하는지 확인하지 않았지만 아마도 작동하도록 정의해야 할 것 [NSString : NSString]
입니다.
편집하다
질문과 제목을 다시 읽으면서 array of array
. 를 사용 NSString
하는 한 배열 배열이 작동 할 것이라고 생각합니다. 그러나 내 답변이 관련이 없다고 생각되면 댓글로 알려 주시면 삭제하겠습니다.
답변
다음은 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
}
}
}
기억 개체의 요구가 구현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
}
}
도움이 되었기를 바랍니다!
답변
이 시도.
UserDefaults에서 데이터를 가져옵니다.
var defaults = NSUserDefaults.standardUserDefaults()
var dict : NSDictionary = ["key":"value"]
var array1: NSArray = dict.allValues // Create a dictionary and assign that to this array
defaults.setObject(array1, forkey : "MyKey")
var myarray : NSArray = defaults.objectForKey("MyKey") as NSArray
println(myarray)
답변
스위프트 4.0
저장:
let arrayFruit = ["Apple","Banana","Orange","Grapes","Watermelon"]
//store in user default
UserDefaults.standard.set(arrayFruit, forKey: "arrayFruit")
술책:
if let arr = UserDefaults.standard.array(forKey: "arrayFruit") as? [String]{
print(arr)
}
답변
여기 있습니다 :
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
}
답변
Swift 5+ 로 작업하는 경우을 사용해야 UserDefaults.standard.setValue(value, forKey: key)
하며 저장된 데이터를 얻으려면을 사용해야 UserDefaults.standard.dictionary(forKey: key)
합니다.