programing

NSUser 기본값으로 배열을 저장하고 읽는 방법을 신속하게 선택할 수 있습니까?

powerit 2023. 8. 26. 12:26
반응형

NSUser 기본값으로 배열을 저장하고 읽는 방법을 신속하게 선택할 수 있습니까?

Swift의 사전처럼 이 형식의 개체를 추가하려면 배열을 만들어야 합니다: ["key1": "value1", "key2": "value2"]

내가 그것을 저장할 때NSUserDefaults모든 것이 옳지만,NSUserDefaults열쇠로 이것이 충돌합니다.내 varobj에는 어떤 유형의 데이터가 필요합니까?

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]()

배열 내

배열 저장

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방법은 다음 링크를 참조하십시오.

메모들

  • 영 병합 연산자(??)를 사용하면 저장된 배열이나 빈 배열을 충돌 없이 반환할 수 있습니다.즉, 객체가 0을 반환하면 다음 값이 다음과 같습니다.??연산자가 대신 사용됩니다.
  • 보다시피 기본 설정은 다음과 같습니다.Int,Bool,그리고.Date저는 또한 그것을 시험했습니다.Double제가 알기로는 부동산 목록에 저장할 수 있는 모든 것이 이렇게 작동합니다.

@Zaph가 댓글에서 말하는 것에 추가하기 위해서입니다.

나도 너와 같은 문제를 가지고 있어, 알다시피, 일련의.String저장되지 않았습니다.Apple이 String 및 NSSString과 같은 유형을 브리지하지만, 나는 일련의 데이터를 저장할 수 없었습니다.[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
    }
  }

}

개체를 구현해야 합니다. 그렇지 않으면 인코딩이 작동하지 않습니다.이것은 무엇입니까?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
  }
}

이것이 도움이 되길 바랍니다!

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

이거 먹어봐요.

사용자 기본값에서 데이터를 가져옵니다.

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

언급URL : https://stackoverflow.com/questions/25179668/how-to-save-and-read-array-of-array-in-nsuserdefaults-in-swift

반응형