【问题标题】:error in FOR IN loopFOR IN 循环中的错误
【发布时间】:2016-02-13 07:30:52
【问题描述】:

我正在尝试在 for in 循环中为数组 quandlURLs 运行以下函数。我在“loadDataFromURL”行中遇到错误,说:无法将 [String] 类型的值转换为“Sting”类型的预期参数。有人可以告诉我我在这里缺少什么。谢谢!!

class func getDataFromQuandlWithSuccess(success: ((Quandl: NSData!) -> Void)) {
 let quandlGold = "https://www.quandl.com/api/v3/datasets/LBMA/GOLD.json?auth_token=xyzDP7Cj-2F_Jss7sYHf&rows=1"        
quandlURLs = [quandlGold, quandlSilver,quandlPlatinum,quandlPalladium]
    var index: Int
    var urlData = [String]()
    for index in quandlURLs {
        loadDataFromURL(NSURL(string: quandlURLs[index])!, completion:{(data, error) -> Void in
            //2
            if let urlData[index] = data {
                //3
                success(Quandl: urlData[index])
                //below worked and showed raw data
                //print("Successful \(urlData)")

            }
        })

    }
}

这里是 loadDataFromURL 函数

class func loadDataFromURL(url: NSURL, completion:(data: NSData?, error: NSError?) -> Void) {
let session = NSURLSession.sharedSession()

// Use NSURLSession to get data from an NSURL
let loadDataTask = session.dataTaskWithURL(url, completionHandler: { (data: NSData?, response: NSURLResponse?, error: NSError?) -> Void in
  if let responseError = error {
    completion(data: nil, error: responseError)
  } else if let httpResponse = response as? NSHTTPURLResponse {
    if httpResponse.statusCode != 200 {
      let statusError = NSError(domain:"com.raywenderlich", code:httpResponse.statusCode, userInfo:[NSLocalizedDescriptionKey : "HTTP status code has unexpected value."])
      completion(data: nil, error: statusError)
    } else {
      completion(data: data, error: nil)
    }
  }
})

loadDataTask.resume()
}
}

【问题讨论】:

  • 你能突出显示错误行吗?

标签: arrays swift for-loop


【解决方案1】:

您只需将for index in quandlURLs 更改为for index in 0..<quandlURLs.count

if let urlData[index] = data 还有一个问题,因为你不能对数组使用可选绑定,你需要定义一个新值,所以去if let urlDataEntry = data,在这种情况下你的 urlIndex 数组应该是 NSData 类型.

您也不需要var index: Int 行。在创建 Int 数组的 ..

例如:

class func getDataFromQuandlWithSuccess(success: ((Quandl: NSData!) -> Void)) {
    let quandlGold = "https://www.quandl.com/api/v3/datasets/LBMA/GOLD.json?auth_token=xyzDP7Cj-2F_Jss7sYHf&rows=1"        
    quandlURLs = [quandlGold, quandlSilver,quandlPlatinum,quandlPalladium]
    var urlData = [NSData]()
    for index in 0..<quandlURLs.count {
        loadDataFromURL(NSURL(string: quandlURLs[index])!, completion:{(data, error) -> Void in
            //2
            if let urlDataEntry = data {
                //3
                urlData[index] = urlDataEntry
                success(Quandl: urlDataEntry)
                //below worked and showed raw data
                //print("Successful \(urlData)")

            }
         })

    }
}

【讨论】:

  • 感谢您的评论 - 不幸的是,错误仍然相同。我应该提到该数组是由网络链接构建的,例如let quandlGold = "quandl.com/api/v3/datasets/LBMA/…" 我将此添加到上述评论中以进一步澄清。
  • 你能把全班都包括进来吗? loadDataFromURL 似乎是您类中的另一个函数,没有它我无法测试代码。
  • 嗨,James,我在上面添加了 loadDataFromURL。谢谢你看这个!干杯
  • 我又看了一遍,发现问题出在哪里。 for in 循环将索引设置为数组中的字符串值,因此当您下标(即 quandlURLs[index])时,您将使用字符串值执行此操作,而它需要一个 Int。我已更新我的答案以显示
  • 嗨,詹姆斯,很好。如果 let urlData[index] = data {........你介意再看看这个吗?
猜你喜欢
  • 1970-01-01
  • 2020-03-30
  • 1970-01-01
  • 2015-02-25
  • 2018-01-14
  • 1970-01-01
  • 1970-01-01
  • 2017-02-12
  • 2018-11-14
相关资源
最近更新 更多