将项添加到数组会覆盖以前的项并添加一个新项

时间:2017-08-02 19:57:09

标签: ios arrays swift

我在向数组追加项目时遇到问题。我正在使用Alamofire和Open Weather API来获取这些项目。

获取JSON响应并解析它不是问题。将第一个项添加到数组也可以正常工作。

项目示例:

  

日期:星期一
高温:85F
低温:   72F
天气类型:雨

     

日期:星期二
高温:102F
低温:   97F
天气类型:晴天

     

日期:星期三
高温:98F
低温:   62F
天气类型:雨

     

日期:星期四
高温:95F
低温:   92F
天气类型:多云

     

日期:星期五
高温:83F
低温:   77F
天气类型:晴天

     

日期:星期六
高温:100F
低温:85F
天气类型:晴天

这些存储在 WeatherForecast 对象中,而该对象又被添加/附加到 WeatherForecasts 数组。

问题是最终发生的事情是这种情况下的最后一个值 星期六最终填满阵列中的所有六个元素。

使用for循环我注意到它是这样的。

正确添加第一项,然后添加第二项以覆盖第一项。然后第三项覆盖第一项和第二项......重复直到结束。

使用数字会发生什么: 1 22 333 4444 55555 666666< - 最终结果,最后一个元素重复6次。

我想要的: 123456

我的代码如下:

class WeatherService
{
    private var weatherForecasts: [WeatherForecast] = [WeatherForecast]();
    private var weatherForecast: WeatherForecast = WeatherForecast();
    private var arrayOfInts: [Int] = [Int]();
    private var counter: Int = 0;

    public func downloadWeatherForecast(getForecastURL: String,
                completed: @escaping(_ weatherPayload: WeatherPayload) -> Void)
    {
        Alamofire.request(getForecastURL)
                 .responseJSON
        {
            response in

            let result = response.result;

            if let dict = result.value as? Dictionary<String, AnyObject>
            {
                if let list = dict["list"] as? [Dictionary<String, AnyObject>]
                {

                    for dictItem in list
                    {
                        if let temp = dictItem["temp"] as? Dictionary<String, Double>
                        {

                            if let maxTemp = temp["max"]
                            {
                                self.weatherForecast.setHighTemp(highTemp: self.convertToString(temp: maxTemp));
                            }

                            if let minTemp = temp["min"]
                            {
                                self.weatherForecast.setLowTemp(lowTemp: self.convertToString(temp: minTemp));
                            }
                        }

                        if let weatherArray = dictItem["weather"] as?
                            [Dictionary<String, AnyObject>]
                        {
                            if let main = weatherArray[0]["main"] as? String
                            {
                                self.weatherForecast.setWeatherType(weatherType: main.capitalized);
                            }
                        }

                        if let date = dictItem["dt"] as? Double
                        {
                            let convertedDate = Date(timeIntervalSince1970: date);
                            self.weatherForecast.setDate(date: convertedDate.dayOfWeek()!);
                        }

                        self.counter += 1;
                        self.arrayOfInts.append(self.counter);
                        self.weatherForecasts.append(self.weatherForecast);
                    }

                    //Array of ints works fine.
                    for integer in self.arrayOfInts
                    {
                        print("Int val is : \(integer)");
                    }
                }
                completed(self.retrievalSuccess(weatherForecasts: self.weatherForecasts));
            }
            else
            {
                completed(self.retrievalFailure(message: "Six day forecast error."));
            }
        }
    }
}

我尝试使用arrayOfInts使用append并且它工作正常,没有重写让我难以理解我的 WeatherForecasts 数组有什么问题。

2 个答案:

答案 0 :(得分:2)

问题是weatherForecast会多次添加到您的阵列中。 让我们说你天气预报的名字是&#39; X&#39; 您的代码执行此操作:

第一次迭代:

X.day = "Monday"
forecasts.add(X)
//forecasts is now [X]

然后,如果您打印所有预测天数,它将打印&#34;星期一&#34;

第二次迭代:

X.day = "Tuesday"
forecasts.add(X)
//forecasts is now [X,X]

第3次迭代:

X.day = "Wednesday"
forecasts.add(X)
//forecasts is now [X,X,X]

如果您打印所有预测天数..它将打印&#34;周三,周三,周三和#34;

发生这种情况是因为您引用同一个对象并对其进行更新 ..您需要做的是在每次迭代时创建一个新对象,以便您的数组看起来像这[X,Y,Z]而不是[X,X,X]

尝试更改代码的这一部分:

for dictItem in list {

为此:

for dictItem in list {
    weatherForecast = WeatherForecast()

答案 1 :(得分:0)

每次迭代数组

时都需要创建新的WeatherForecast对象
class WeatherService {
    private var weatherForecasts: [WeatherForecast] = [WeatherForecast]()

    public func downloadWeatherForecast(getForecastURL: String, completed: @escaping(_ weatherPayload: WeatherPayload) -> Void) {
        Alamofire.request(getForecastURL).responseJSON { response in
            if let dict = response.result.value as? Dictionary<String, AnyObject> {
                if let list = dict["list"] as? [Dictionary<String, AnyObject>] {
                    for dictItem in list {
                        var weatherForecast = WeatherForecast()
                        if let temp = dictItem["temp"] as? Dictionary<String, Double> {
                            if let maxTemp = temp["max"] {
                                weatherForecast.setHighTemp(highTemp: self.convertToString(temp: maxTemp));
                            }

                            if let minTemp = temp["min"] {
                                weatherForecast.setLowTemp(lowTemp: self.convertToString(temp: minTemp));
                            }
                        }

                        if let weatherArray = dictItem["weather"] as? [Dictionary<String, AnyObject>] {
                            if let main = weatherArray[0]["main"] as? String {
                                weatherForecast.setWeatherType(weatherType: main.capitalized);
                            }
                        }

                        if let date = dictItem["dt"] as? Double {
                            let convertedDate = Date(timeIntervalSince1970: date);
                            weatherForecast.setDate(date: convertedDate.dayOfWeek()!);
                        }

                        self.arrayOfInts.append(self.counter);
                        self.weatherForecasts.append(weatherForecast);
                    }
                }
                completed(self.retrievalSuccess(weatherForecasts: self.weatherForecasts));
            } else {
                completed(self.retrievalFailure(message: "Six day forecast error."));
            }
        }
    }
}