为什么在将字典添加到数组时添加

问题描述:

我是新来的Swift和实验。尝试创建一个简单的字典值数组。这很简单,但我简单地为字典对象复制了一小段代码,更改了每个部分中的值,然后将这四部分中的每一个添加到数组中。为什么在将字典添加到数组时添加

当我打印数组时,我发现它包含最后一个字典对象的四个版本。怎么可能?我会期望该数组有四个字典对象,即添加每个对象之一。

func countDown() { 
    let dict: NSMutableDictionary = [:] 
    let enduroArrayFile = NSMutableArray() 

    dict.setObject(1, forKey: "SectionDistance") 
    dict.setObject("S", forKey: "Direction") 
    dict.setObject(0, forKey: "ArrivalTime") 
    dict.setObject(0, forKey: "AverageSpeed") 
    //saving dictionary to array 
    enduroArrayFile.addObject(dict) 

    dict.setObject(1.2, forKey: "SectionDistance") 
    dict.setObject("S", forKey: "Direction") 
    dict.setObject(0, forKey: "ArrivalTime") 
    dict.setObject(0, forKey: "AverageSpeed") 
    //saving dictionary to array 
    enduroArrayFile.addObject(dict) 

    dict.setObject(2, forKey: "SectionDistance") 
    dict.setObject("R", forKey: "Direction") 
    dict.setObject(0, forKey: "ArrivalTime") 
    dict.setObject(0, forKey: "AverageSpeed") 
    //saving dictionary to array 
    enduroArrayFile.addObject(dict) 

    dict.setObject(2.1, forKey: "SectionDistance") 
    dict.setObject("S", forKey: "Direction") 
    dict.setObject(0, forKey: "ArrivalTime") 
    dict.setObject(0, forKey: "AverageSpeed") 
    //saving dictionary to array 
    enduroArrayFile.addObject(dict) 

    print (enduroArrayFile) 
} 

输出是

(
    { 
    ArrivalTime = 0; 
    AverageSpeed = 0; 
    Direction = S; 
    SectionDistance = "2.1"; 
}, 
    { 
    ArrivalTime = 0; 
    AverageSpeed = 0; 
    Direction = S; 
    SectionDistance = "2.1"; 
}, 
    { 
    ArrivalTime = 0; 
    AverageSpeed = 0; 
    Direction = S; 
    SectionDistance = "2.1"; 
}, 
    { 
    ArrivalTime = 0; 
    AverageSpeed = 0; 
    Direction = S; 
    SectionDistance = "2.1"; 
    } 
) 
+3

因为NSDictionary是*引用类型*。您可以使用4个引用来创建一个具有相同一对一字典的数组。 –

+0

请考虑使用Swift值类型:Dictionary,Array,... –

您错误地一遍又一遍地重复使用dict。您需要每次创建一个新实例。

func countDown() { 
    let enduroArrayFile = NSMutableArray() 

    var dict: NSMutableDictionary = [:] 
    dict.setObject(1, forKey: "SectionDistance") 
    dict.setObject("S", forKey: "Direction") 
    dict.setObject(0, forKey: "ArrivalTime") 
    dict.setObject(0, forKey: "AverageSpeed") 
    //saving dictionary to array 
    enduroArrayFile.addObject(dict) 

    dict = [:] 
    dict.setObject(1.2, forKey: "SectionDistance") 
    dict.setObject("S", forKey: "Direction") 
    dict.setObject(0, forKey: "ArrivalTime") 
    dict.setObject(0, forKey: "AverageSpeed") 
    //saving dictionary to array 
    enduroArrayFile.addObject(dict) 

    dict = [:] 
    dict.setObject(2, forKey: "SectionDistance") 
    dict.setObject("R", forKey: "Direction") 
    dict.setObject(0, forKey: "ArrivalTime") 
    dict.setObject(0, forKey: "AverageSpeed") 
    //saving dictionary to array 
    enduroArrayFile.addObject(dict) 

    dict = [:] 
    dict.setObject(2.1, forKey: "SectionDistance") 
    dict.setObject("S", forKey: "Direction") 
    dict.setObject(0, forKey: "ArrivalTime") 
    dict.setObject(0, forKey: "AverageSpeed") 
    //saving dictionary to array 
    enduroArrayFile.addObject(dict) 

    print (enduroArrayFile) 
} 

我不知道斯威夫特很好,所以我可能得到了错误的语法。

+0

谢谢。你钉了它。我的想法与此类似,但我预计会看到* first *字典值重复四次,而不是最后一组值。看到最后一集四次让我完全困惑。任何想法为什么? – Jeremy

+0

当然。字典的值一遍又一遍地被替换。最后一个胜利。 – rmaddy