我在向数组追加项目时遇到问题。我正在使用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 数组有什么问题。
答案 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."));
}
}
}
}