NSUserdefaults की सारणी को सरणी में कैसे सहेजा और पढ़ा जाए?


81

मुझे स्विफ्ट में एक शब्दकोश की तरह इस प्रारूप के साथ वस्तुओं को जोड़ने के लिए एक सरणी बनाने की आवश्यकता है: ["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 स्ट्रिंग को हैंडल कर सकते हैं लेकिन Array और Dictionary को नहीं, केवल डॉक्स का वर्णन करने वाले NS * प्रकार के लिए काम कर रहे हैं। तो यह स्विफ्ट में एक बग जैसा दिखता है।
ज़ाफ

@ ज़ैफ़ क्या कहती है उससे थोड़ा आगे जाने के लिए, मैंने [स्ट्रिंग] के साथ परीक्षण किया और यह काम नहीं कर रहा है, लेकिन यह [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]()

इंट सरणी

सरणी सहेजें

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। इसे करने के लिए निम्न लिंक देखें।

टिप्पणियाँ

  • निवल सहवर्ती ऑपरेटर ( ??) आपको दुर्घटनाग्रस्त हुए बिना सहेजे गए सरणी या खाली सरणी को वापस करने की अनुमति देता है। इसका मतलब है कि यदि वस्तु शून्य हो जाती है, तो ??इसके बजाय ऑपरेटर के बाद के मूल्य का उपयोग किया जाएगा।
  • आप देख सकते हैं, बुनियादी सेटअप के लिए एक ही था Int, Boolहै, और Date। मैंने इसके साथ परीक्षण भी किया Double। जहाँ तक मुझे पता है, एक संपत्ति सूची में आप जो कुछ भी बचा सकते हैं वह इस तरह से काम करेगा।

16

बस टिप्पणी में @Zaph क्या कहते हैं पर जोड़ने के लिए।

मुझे आपके समान ही समस्या है, जैसा कि पता है, की सरणी Stringसहेजी नहीं गई है। हालांकि Apple पुलों जैसे स्ट्रिंग और 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 तानाशाही जोड़ता हूं: [AnyObject!] = [] और var array1: NSArray = तानाशाह लेकिन यह खाली है, यह कैसे सही ढंग से बना सकता है?
user3745888

@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

यदि आप स्विफ्ट 5+ के साथ काम कर रहे हैं तो आपको उपयोग करना होगा UserDefaults.standard.setValue(value, forKey: key)और सहेजे गए डेटा को प्राप्त करना होगा UserDefaults.standard.dictionary(forKey: key)

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.