Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/ios/98.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ios 在Swift中处理类型,使用枚举填充字典';对于循环';直通阵列_Ios_Json_Swift_Dictionary_Enumerate - Fatal编程技术网

Ios 在Swift中处理类型,使用枚举填充字典';对于循环';直通阵列

Ios 在Swift中处理类型,使用枚举填充字典';对于循环';直通阵列,ios,json,swift,dictionary,enumerate,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["masco

我正在用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!
如果这与这个问题有关,我将使用SwiftyJSON访问json中的项目。有关SwiftyJSON的信息如下:

因此,在本例中,我们将处理几种不同的类型,例如字符串、int、boolean和空值的概率

我正在处理的json并不像上面的例子那样只有5个条目。它有很多。因此,为了一个有效的计划,我做了以下几点:

for (indexCount, element) in enumerate(appDelegate.json["info"]){
    dict[element.0] = json["info"][element.0]
}
这意味着,我不再为所有可能的情况创建特定的赋值语句,而是从每个json项循环并创建一个元组。元组包含键和值。使用该键和值,我会自动设置dict项目的键和值

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

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
因此,概括一下:如果我通过枚举具有不同值类型的json数组来填充“String,AnyObject”字典。。。在这个过程的前端或后端,我可以做些什么来避免错误并获得有用的数据?特别是,字符串似乎工作正常,但当我遇到int并尝试将其转换为字符串时(我尝试了几种方法),它会一起失败或返回nil


谢谢。

JSON对象中保存的数据可以是
字符串
Bool
NSNumber
NSURL
。。。您只使用了
String
Int
Bool
。它们的常见超类型是
Any
。将您的
字典声明为
字典
。(随后使用
任何
数据的每个位置,您将被迫键入cast to
String
Bool
Int
,视“标记”而定)

但是,我要说的是,通过使用
Any
你是在与类型作斗争。Swift是一种强类型、静态类型的编程语言,您需要通过显式地使用类型来使用它。将JSON中的泛型输入数据转换为显式类型的抽象,操纵这些抽象,然后,如果需要,将其转换回泛型输出数据,转换为JSON

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
是您所能做的最好的方法,您将需要处理
任何

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

这个问题从循环JSON结果开始,将它们添加到字典中:

var dict = Dictionary<String, AnyObject>()
for (indexCount, element) in enumerate(appDelegate.json["info"]){
    dict[element.0] = json["info"][element.0]
}
var dict=Dictionary()
对于枚举(appDelegate.json[“info”])中的(indexCount,element){
dict[element.0]=json[“info”][element.0]
}
现在我看到问题是数组被定义为“String,AnyObject”。但如果我们将数组声明为:

var dict = Dictionary<String, JSON>()
var dict=Dictionary()

(我们将AnyObject更改为JSON)…然后我们可以添加和检索原始JSON值。然后,当我们要在某个地方使用该值时(例如将字符串放入标签,或获取一个int来进行计算),快速JSON允许我们使用一个下标(例如.string或.int)来强制转换该值。

如果将来自JSON的所有值包装成字符串文字,例如
let str=“\(intValueFromJSON)”会发生什么
?如果我像您那样将值包装成字符串文字,则得到零
var dict = Dictionary<String, JSON>()