在Swift中处理类型,用枚举填充字典' For Loop'通过数组

时间:2015-05-30 03:16:21

标签: ios json swift dictionary enumerate

我用json的值填充dict:

var dict = Dictionary<String, AnyObject>()

dict["venue"] =         json["info"]["venue"].string!
dict["addressStreet"] = json["info"]["addressStreet"].string!
dict["capacity"] =      json["info"]["capacity"].int!
dict["mascot"] =        json["info"]["mascot"].string!
dict["foodService"] =   json["info"]["foodService"].boolean!

想象一下json的值是:

//Smith Concert Hall (a string)
//1234 Main Street (a string)
//150 (a number)
//no mascot listed - a null value
//true for food service - a boolean value

如果它与此问题有关,我使用SwiftyJSON访问json中的项目。关于SwiftyJSON的信息在这里: https://github.com/SwiftyJSON/SwiftyJSON

因此,在这个例子中,我们处理了几种不同的类型,例如字符串,整数,布尔值以及空值的可能性。

我正在研究的json并没有像上面的例子那样有5个项目。它有很多。因此,对于一个有效的计划,我做了以下几点:

for (indexCount, element) in enumerate(appDelegate.json["info"]){
    dict[element.0] = json["info"][element.0]
}

这意味着我不是为所有可能性创建特定的赋值语句,而是循环并从每个json项创建一个元组。元组包含键和值。使用该键和值,我将自动设置dict项的键和值。

但是 - 当我稍后使用dict项目时,会出现问题。例如,如果我尝试这样做,我会得到nil:

let a = dict["capacity"] as? String
println(a)  //results with: nil

let b = dict["capacity"]
println("\(b)")  //results with: nil

let c = String(stringInterpolationSegment: dict["capacity"])
println(c)  //results with: nil

所以回顾一下:如果我正在填充&#34; String,AnyObject&#34;通过枚举具有不同值类型的json数组的字典...我可以在此过程的前端或后端做什么来避免错误并获得有用的数据?特别是,字符串似乎工作得很好,但是当我遇到一个int并尝试将它作为一个字符串(我尝试了几种方法)时,它会一起失败或返回nil。

谢谢。

2 个答案:

答案 0 :(得分:0)

JSON对象中保存的数据可以是StringBoolNSNumberNSURL,...而您只使用{{ 1}},StringInt。这些常见的超类型是Bool。将您的Any声明为dict。 (您随后使用Dictionary<String,Any>数据时,您将被强制输入AnyStringBool以适合“标记”

但是,我会说,通过使用Int你正在与这些类​​型作斗争。 Swift是一种强类型,静态类型的编程语言,你需要通过明确你的类型来使用它。从JSON获取通用输入数据到显式类型的抽象,操纵那些抽象,然后,如果需要,转换回通用输出数据,转换为JSON。

Any

当然,只有class Event { var venue : String var addressStreet : String var capacity : Int var mascot : String var foodService : Bool // ... many more ... init (json:JSON) { self.venue = json["venue"].string! ... } } var event1 = Event(json["info"]) 数据标记是静态的,上述内容才有效。相反,如果数据确实没有静态结构,那么JSON是您可以做的最好的,您需要处理Dictionary<String,Any>

答案 1 :(得分:0)

事实证明,当循环通过JSON将项添加到字典时,您不必担心它们的类型。你可以按原样添加它们:它们的'JSON'类型与数组保持不变。

这个问题首先是通过JSON结果循环将它们添加到字典中:

var dict = Dictionary<String, AnyObject>()
for (indexCount, element) in enumerate(appDelegate.json["info"]){
    dict[element.0] = json["info"][element.0]
}

现在我看到问题是数组被定义为'String,AnyObject'。但事实证明,如果我们将数组声明为:

var dict = Dictionary<String, JSON>()

(我们将AnyObject更改为JSON)...然后我们可以添加和检索原始JSON值。然后,当我们要在某处使用值时(例如将字符串放入标签,或者获取int来进行计算),SwiftyJSON允许我们使用.string或.int等下标来转换它。