如何在swift中全局使用解析的值

时间:2016-05-04 08:06:20

标签: ios json swift global-variables

func jsonParsing1(){
           do{
            let path : NSString =  NSBundle.mainBundle().pathForResource("fileName", ofType: "json")!
            let data : NSData = try! NSData(contentsOfFile: path as String, options: NSDataReadingOptions.DataReadingMappedIfSafe)
            let jsonData = try! NSJSONSerialization.JSONObjectWithData(data, options: NSJSONReadingOptions.MutableContainers)
            let jsonArray = jsonData
           ** let templeArray = (jsonArray.valueForKey("temple-name") as? NSArray)!**

           }catch {
           print(error)


        }
    }
}

我的json文件是 [     {         “寺庙名称”:" aaa",         “image”:" image.png“,         “描述”:“aaa”     },         {         “寺庙名称”:" bbb",         “image”:" image1.png“,         “description”:“bbb”     } ] 我在一个单独的类中使用json文件,并试图通过该项目访问解析的数组。 使用全局数组但从另一个类调用时返回nil。提前谢谢。

我需要全局使用templeArray。

4 个答案:

答案 0 :(得分:0)

您可以使用templeArray属性创建单例类,将值存储在此数组中并通过singleton类的共享实例访问它。 或者,

您可以在appDelegate中声明templeArray属性并对其进行全局访问。

答案 1 :(得分:0)

您可以static变量访问项目中的数据。

class GlobalVariables {
    static var templeArray : NSMutableArray?
}

您可以通过

在整个申请过程中使用templeArray
GlobalVariables.templeArray?.objectAtIndex(index)

答案 2 :(得分:0)

请尝试这种方法:

class MyClass {

static var templeArray : NSArray?


     func jsonParsing1(){
        let path : NSString =  NSBundle.mainBundle().pathForResource("fileName", ofType: "json")!
        let data : NSData = try! NSData(contentsOfFile: path as String, options: NSDataReadingOptions.DataReadingMappedIfSafe)
        let jsonData = try! NSJSONSerialization.JSONObjectWithData(data, options: NSJSONReadingOptions.MutableContainers)
        let jsonArray = jsonData
        MyClass.templeArray = (jsonArray.valueForKey("temple-name") as? NSArray)!

        /*
         * You can now access to templeArray in this way:
         * let myArray : NSArray? = MyClass.templeArray
         */
     }
}

另外,do / catch块在Swift2中没用。

编辑: 你错了。

let templeArray = (jsonArray.valueForKey("temple-name") as? NSArray)!

总是为零,因为字段名称不是数组,而是字符串。 你必须这样做:

MyClass.templeArray = jsonArray

然后你可以通过这种方式进入第一座寺庙:

let temple = MyClass.templeArray[0]
let templeName : String = temple.objectForKey("temple-name") as? String

答案 3 :(得分:0)

此代码应该有效:

var templeArray: NSMutableArray = []

class Parser {

    func jsonParsing1() {
        do {
            let path : NSString =  NSBundle.mainBundle().pathForResource("fileName", ofType: "json")!
            let data : NSData = try NSData(contentsOfFile: path as String, options: NSDataReadingOptions.DataReadingMappedIfSafe)
            let jsonData = try NSJSONSerialization.JSONObjectWithData(data, options: NSJSONReadingOptions.MutableContainers)
            let jsonArray = jsonData
            if let rawTempleArray = jsonArray.valueForKey("temple-name") as? NSMutableArray {
                templeArray = rawTempleArray
            } else {
                print("temple-name is not array")
            }
        } catch {
            print(error)
        }
    }
}

我会这样做:

struct Temple { //or class
    // your fields here
    init? (templeDictionary: NSDictionary) {
        // your parser here
    }
}


class TheParser {
    static var theTempleArray: [Temple] = []

    func jsonParsing1() {
        do {
            let path : NSString =  NSBundle.mainBundle().pathForResource("fileName", ofType: "json")!
            let data : NSData = try NSData(contentsOfFile: path as String, options: NSDataReadingOptions.DataReadingMappedIfSafe)
            let jsonData = try NSJSONSerialization.JSONObjectWithData(data, options: NSJSONReadingOptions.MutableContainers)
            let jsonArray = jsonData
            if let rawTempleArray = jsonArray.valueForKey("temple-name") as? NSArray {
                for temple in rawTempleArray {
                    if let theTemple = temple as? NSDictionary { // or NSArray or String depending of your json structure
                        if let templeItem = Temple(templeDictionary: theTemple) {
                            TheParser.theTempleArray.append(templeItem)
                        }
                    }
                }
            } else {
                print("temple-name is not array")
            }

        } catch {
            print(error)

        }
    }

}