2016-03-30 43 views
1

我正在解析JSON並將數據附加到一個數組,並且當數組包含正確數量的元素時,它就是同一個元素一遍又一遍,無論最後一個增加了。這裏是我使用的代碼:數組只包含最後一個增加的值,但count仍然相同

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)") 
    } 

} 

當我打印的陣列,它只是打印但是添加了很多元素,但他們是最後一個元素的所有重複添加。

+5

厄運蝙蝠俠的神聖金字塔... – PeejWeej

+0

'是否在ns'編譯所有NS? – vadian

+0

我認爲它可以工作,但是你將無法訪問ns所在的數組,因此這是非常糟糕的做法,相當混亂。 (所以有1或2個字母的名稱,但這是一個不同的問題。) – PeejWeej

回答

1

問題是,你繼續追加理智的實例 - 即self.c。由於c的類型是class而不是struct,因此不會進行復制;一次又一次地將相同的參考添加到陣列。

可以,或者通過分配在循環的每個迭代一個新的c修正通過使c的類型struct這個問題:

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成員。由於你在循環內改變c,使它成爲一個成員很可能是一個錯誤。已經給

+0

工作完美,感謝您的快速答案! – chrisz

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)") 
} 
+0

謝謝!較新的Swift,感謝幫助。 – chrisz

+0

沒問題。祝你好運學習! – PeejWeej

相關問題