신속하게 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"))
}
질문은 "배열 배열"이라고 읽지 만 대부분의 사람들은 배열을 .NET에 저장하는 방법을 알고 싶어서 여기에 올 것입니다 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
}
}
}
Remember that your object needs to implement NSCoding
or else the encoding won't work. Here is what SNStock
looks like:
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
}
}
Hope this helps!
Try this.
To get the data from the 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)
Swift 4.0
Store:
let arrayFruit = ["Apple","Banana","Orange","Grapes","Watermelon"]
//store in user default
UserDefaults.standard.set(arrayFruit, forKey: "arrayFruit")
Fetch:
if let arr = UserDefaults.standard.array(forKey: "arrayFruit") as? [String]{
print(arr)
}
'code' 카테고리의 다른 글
모든 Android 브로드 캐스트 인 텐트 목록은 어디에 있습니까? (0) | 2020.11.03 |
---|---|
Node.js로 JSON API 호출 (0) | 2020.11.03 |
iOS Swift에서 이미지에 텍스트를 어떻게 추가합니까? (0) | 2020.11.03 |
Dispatcher.Invoke를 사용하여 주 스레드가 아닌 스레드에서 WPF 컨트롤 변경 (0) | 2020.11.03 |
iOS UIDevice 방향 감지 (0) | 2020.11.03 |