신속하게 NSUserdefaults에서 배열 배열을 저장하고 읽는 방법은 무엇입니까?


81

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"))
}

3
NSUserDefaults는 문서를 설명하는 NS * 유형에 대해서만 작동하는 배열 및 사전이 아닌 문자열을 처리 할 수있는 것처럼 보입니다. 그래서 이것은 Swift의 버그처럼 보입니다.
zaph

@Zaph가 말하는 것 이상으로 이동하기 위해 [String]으로 테스트했지만 작동하지 않지만 [NSString]으로 작동합니다. 내 대답을 확인하십시오.
HpTerm

답변:


215

질문은 "배열 배열"이라고 읽지 만 대부분의 사람들이 배열을 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. 내가 아는 한, 속성 목록에 저장할 수있는 모든 것은 이와 같이 작동합니다.

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]
}

사전이 아닌 NSString 배열을 만들었습니다. 사전과 함께 작동하는지 확인하지 않았지만 아마도 작동하도록 정의해야 할 것 [NSString : NSString]입니다.

편집하다

질문과 제목을 다시 읽으면서 array of array. 를 사용 NSString하는 한 배열 배열이 작동 할 것이라고 생각합니다. 그러나 내 답변이 관련이 없다고 생각되면 댓글로 알려 주시면 삭제하겠습니다.


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
    }
  }

}

기억 개체의 요구가 구현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
  }
}

도움이 되었기를 바랍니다!


3

이 시도.

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)

var dict : [AnyObject!] = [] 및 var array1 : NSArray = dict를 추가했지만 이것은 비어 있습니다. 어떻게 올바르게 만들 수 있습니까?
user3745888 2014-08-07

@AlvinVarghese 실제로 코드를 사용해보십시오. 오타가 있으며 그것이 수정 된 경우에도 "값"이라는 항목이 하나 인 배열 만 저장됩니다.
zaph

3

스위프트 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)
    }

1

여기 있습니다 :

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 
}

0

Swift 5+ 로 작업하는 경우을 사용해야 UserDefaults.standard.setValue(value, forKey: key)하며 저장된 데이터를 얻으려면을 사용해야 UserDefaults.standard.dictionary(forKey: key)합니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.