【问题标题】:Swift NSUserDefaults setObject for ArraySwift NSUserDefaults setObject 用于数组
【发布时间】:2015-06-05 14:33:38
【问题描述】:

我需要使用 NSUserDefaults 保存从 jSON 获得的数组,问题是它只保存第一个字符串而不是所有数组。因此,如果数组像 NewYork,London,Rome .. 它只保存 NewYork。我将它用于选择器视图。 这是代码:

编辑 从 JSON 中保存数组:

   if let jsonData = NSJSONSerialization.JSONObjectWithData(urlData!, options: nil, error: &error) as? [String:AnyObject] { // dictionary
                if let locationsArray = jsonData["locations"] as? [[String:AnyObject]] { // array of dictionaries
                    for locationDictionary in locationsArray { // we loop in the array of dictionaries
                        if let location = locationDictionary["location_name"] as? String { // finally, access the dictionary like you were trying to do
                           // println(location)

                            var locationSave: Void = save.setObject(location, forKey: "Location")




                        }
                    }
                }
            }



        }

请求数组:

  var Location = save.objectForKey("Location")!

        var pickerviewFields = Location

   return pickerviewFields.count

提前致谢!

【问题讨论】:

  • 你从哪里得到location
  • 是一个带有数组的变量,我使用 json 从数据库中获取。如果我在控制台中打印变量位置,我可以毫无问题地看到所有位置。所以问题不是 var 位置,而是“位置”变量。

标签: arrays swift nsuserdefaults


【解决方案1】:

你只能保存一个 NSArray,如果 Array 是一个 Swift Array,你需要转换它。另外,NSArray 和 NSDictionary 对象,它们的内容必须是属性列表对象。

以下是转换数组的方法:

var MyArray = ["a", "b", "c"]
var MyNSArray: NSArray

MyNSArray = MyArray as NSArray

println("\(MyNSArray)")

打印:(a,b,c)

我有一个带有一些示例 JSON 的小示例:

    var myJSONString: NSString = "{ \"locations\" : [ { \"location_name\" : \"A\" }, { \"location_name\" : \"B\" }, { \"location_name\" : \"C\" }, { \"location_name\" : \"D\" } ] }"
    var urlData: NSData? = NSData()
    var error: NSError?
    var save = NSUserDefaults.standardUserDefaults()

    urlData = myJSONString.dataUsingEncoding(NSUTF8StringEncoding)

    if let jsonData = NSJSONSerialization.JSONObjectWithData(urlData!, options: nil, error: &error) as? NSDictionary { // dictionary
        if let locationsArray = jsonData["locations"] as? NSArray { // array of dictionaries
            for locationDictionary in locationsArray { // we loop in the array of dictionaries
                if let location = locationDictionary["location_name"] as? NSString { 
                    println(location)
                }
            }
            NSUserDefaults.standardUserDefaults().setObject(locationsArray, forKey: "locationArray")
        }
    }

    println(save.dictionaryRepresentation())

【讨论】:

  • 我在答案中添加了一个关于如何从 Swift Array 转换为 NSArray 的小示例。至于从 JSON 转换整个结果,我建议将其转换为某种数据对象,我使用过这个库:github.com/Ahmed-Ali/JSONExport
  • 它说:字符串不能转换为 NSArray
  • 你必须转换 JSON 结果,首先,像这样: jsonRes = NSJSONSerialization.JSONObjectWithData(returnData!.dataUsingEncoding(NSUTF8StringEncoding)!, options: NSJSONReadingOptions.MutableContainers, error: &err) as? NSDictionary
  • 把这个:[String:AnyObject]改成这个:NSDictionary
  • 同样的问题,String 不能转换为 NSArray
【解决方案2】:

你可以试试这个:

写作

let locationArray = ["London", "NewYork", "Rome"]
let locationData = NSKeyedArchiver.archivedDataWithRootObject(locationArray)
NSUserDefaults.standardUserDefaults().setObject(locationData, forKey: "Location")
NSUserDefaults.standardUserDefaults().synchronize()

阅读

let locationData = NSUserDefaults.standardUserDefaults().objectForKey("Location") as? NSData
if let locationData = locationData {
    let locationArray = NSKeyedUnarchiver.unarchiveObjectWithData(locationData) as? [String]

    if let locationArray = locationArray {
        println(locationArray)
    }
}

【讨论】:

  • 是的,这只是一个测试
  • 这是打印的内容:[, ] [, ] [, ] [, ] [, ] [, ] [, ] [, ] [, ] [, ]
  • 检查我所做的编辑.. 我添加了 JSON 代码以获取数组“位置”,谢谢
  • 把这个:locationDictionary["location_name"] as? String改成这个:locationDictionary["location_name"] as? [String]
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-01-14
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多