我正在解析JSON并将数据附加到数组,虽然数组包含正确数量的元素,但它只是一遍又一遍的相同元素,无论最后添加的是什么。这是我正在使用的代码:
if (statusCode == 200) {
do{
let json = try NSJSONSerialization.JSONObjectWithData(data!, options:.AllowFragments)
if let ns = json as? NSArray{
for ns in ns{
if let name = ns["name"] as? String{
if let number = ns["number"] as? Int{
if let cn = ns["cyclenumber"] as? Int{
if let url = ns["url"] as? String{
self.c.name = name
self.c.number = number
self.c.cycleNumber = cn
self.c.url = url
self.n.array.append(self.c)
}
}
}
}
}
}
}catch {
print("Error with Json: \(error)")
}
}
当我打印数组时,它会打印但是添加了很多元素,但它们都是最后添加元素的副本。
答案 0 :(得分:1)
问题在于你不断追加理智的实例 - 即$newFileName = '{0}-{1}{2}' -f ($rootName,$filecount.ToString("000"),$ext)
$fullPath = Join-Path -Path (Split-Path $filename -Parent) -ChildPath $newFileName
$writer = [IO.File]::CreateText($fullPath)
。由于self.c
的类型是c
,而不是class
,因此不会进行复制;相同的引用一遍又一遍地添加到数组中。
您可以通过struct
输入c
或在循环的每次迭代中指定新的struct
来解决此问题:
c
请注意,if let url = ns["url"] as? String {
var c = TypeOfC() // Make a new instance
c.name = name
c.number = number
c.cycleNumber = cn
c.url = url
self.n.array.append(c)
}
不再是c
的成员。由于你在循环中更改self
,因此首先将其作为成员很可能是一个错误。
答案 1 :(得分:1)
已经给出了答案,但我认为我应该稍微清理一下你的代码:)
guard let data = data where statusCode == 200 else {
return
}
do{
let json = try NSJSONSerialization.JSONObjectWithData(data, options:.AllowFragments)
if let ns = json as? NSArray{
for ns in ns{
if let name = ns["name"] as? String, number = ns["number"] as? Int,
cn = ns["cyclenumber"] as? Int, url = ns["url"] as? String{
self.c.name = name
self.c.number = number
self.c.cycleNumber = cn
self.c.url = url
self.n.array.append(self.c)
}
}
}
}catch {
print("Error with Json: \(error)")
}