【问题标题】:Swift array doesn't hold valuesSwift 数组不保存值
【发布时间】:2014-06-24 18:50:58
【问题描述】:

我在尝试使用 Swift 构建某些东西时遇到了以下问题。显然,我添加到数组中的值没有保存通过某个点。它们在任务运行时通过协议发送得很好,但是在它完成后,如果我尝试查看数组中的值,它会返回空。

我做错了什么?我的猜测是它在任务完成后被释放。如果是这样,有没有办法让它变得强大?关于这个任务,我应该知道些什么吗?您能否向我解释一下这是如何工作的以及我应该怎么做?

代码如下:

var exchangeArray : ExchangeValues[] = [];

func fetchResult(){
    var currenciesOrder = ["EUR", "USD", "GBP", "CHF", "NOK", "SEK", "DKK", "CZK","TRY", "BGN", "MDL", "PLN", "XDR", "XAU", "UAH", "RUB", "RSD","CAD", "AUD", "JPY", "EGP", "BRL","HUF", "MXN","KRW", "CNY","NZD","INR","AED", "ZAR"];
    let dateFormat = NSDateFormatter();
    dateFormat.dateFormat = "yyyy-MM-dd";

    for days in 0..2 {

        let daysToSubstract = Double(60*60*24*days);
        let date : String = dateFormat.stringFromDate(NSDate().dateByAddingTimeInterval(-daysToSubstract));

        var url: NSURL = NSURL(string: "http://openapi.ro/api/exchange/all.json?date=" + date);
        var session = NSURLSession.sharedSession();
        var task = session.dataTaskWithURL(url, completionHandler: {
            (data, response, error) -> Void in
            if (response != nil){
                var err: NSError?;
                if(err?) {
                    println("request Error \(err!.localizedDescription)");
                }
                //send the result to protocol
                let results = NSJSONSerialization.JSONObjectWithData(data, options: NSJSONReadingOptions.MutableContainers, error: &err) as NSDictionary;

                let temp : NSDictionary = results["rate"] as NSDictionary;

                for key in 0..currenciesOrder.count{

                    for (currencyKey : AnyObject, currencyValue : AnyObject) in temp {
                        if currenciesOrder[key] as String == currencyKey as String {
                            let tempExchange = ExchangeValues(currency: currencyKey as? String, value: currencyValue.doubleValue, date:date );
                            self.exchangeArray.append(tempExchange);
                        }

                    }

                }
                self.delegate?.didReceiveResults(self.exchangeArray);
            } else {
                println("error: \(error.localizedDescription)");
            }

        })
        task.resume();
    }

    println("\(exchangeArray.count)");
}

【问题讨论】:

  • 数组很强大。如果您仍然拥有阵列,那么您仍然拥有放入其中的任何东西。您在 dataTaskWithURL 上有一个完成块,您可以在其中添加一些内容到 exchangeArray。这真的叫过吗? if 语句是真的吗?在self.exchangeArray.append(tempExchange);上打断点查看。
  • 你是说数组不保存值是因为最后一个println("\(exchangeArray.count)") 打印一个零吗?
  • 是的,它在最后一次调用时打印 0,我需要数组来保存数据,而不是发送给委托人。

标签: arrays swift


【解决方案1】:

我有点弄清楚问题出在哪里:

任务块返回 void,所以我认为它在完成后会清空数组。结果是创建了另一个从任务中调用的函数,其中数组工作得很好(当它们存在时它被传递)并且可以在那里完成任何进一步的处理。

我希望这对某人有所帮助。代码就这么简单:

    func sendResults(array : ExchangeValues[]) -> Void{

    println("\(exchangeArray.count)"); }

当然,如果需要,您可以让函数返回一些内容。

【讨论】:

  • 如果您想问其他问题,请创建一个新主题,因此不要在指定答案中提出更多问题。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2020-05-15
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多