2014-09-12 40 views
0
@IBOutlet var cityField: UITextField! 
@IBOutlet var message: UILabel! 

@IBAction func buttonPressed(sender: AnyObject) { 

    self.view.endEditing(true)  
    var urlString = "http://www.weather-forecast.com/locations/" + cityField.text.stringByReplacingOccurrencesOfString(" ", withString: "") + "/forecasts/latest" 

    var url = NSURL(string: urlString)   
    let task = NSURLSession.sharedSession().dataTaskWithURL(url) {(data, respons, error) in   
     var urlContent = NSString(data: data, encoding: NSUTF8StringEncoding)    
     var contentArray = urlContent.componentsSeparatedByString("<span class=\"phrase\">")    
     var newContentArray = contentArray[1].componentsSeparatedByString("</span>") 

     self.message.text = newContentArray[0] as? String    
     println(urlString) 
    }   
    task.resume()   
} 

下面是一个简单的天气应用程序我正在做,我的问题是,当我点击按钮,它并没有真正显示天气,这让我这个错误“致命错误:数组索引超出范围“ 请帮助。SWIFT - 垂头丧气数组字符串

+0

println(newContentArray.count)给出了什么? – 2014-09-12 12:54:28

回答

2

在这一行:

var newContentArray = contentArray[1].componentsSeparatedByString("</span>") 

您认为contentArray将至少有两个元素。如果没有,你会崩溃。显然这个假设是不正确的。你不能依赖你从你的应用以外收到的数据;你必须在处理之前验证它的格式。

+0

我从页面源获得,我需要再次检查一遍吗? – Abdou23 2014-09-12 13:04:12

+0

您无法保证您从网络获取的页面格式。特别是如果你解析HTML,他们可以随时改变(它甚至不是API)。只是因为一个网站向你发送了你没有想到的数据,这是不可接受的行为。 – 2014-09-12 13:07:34

+0

我知道我必须使用API​​,如果我要制作一个有用的可靠应用程序,我只是在试验这个应用程序,并且我认为问题与语法本身有关系。 它现在工作正常后,一些变化,但结果需要很长时间才能在模拟器和我的手机上显示,但在控制台中即时显示。 – Abdou23 2014-09-12 13:13:13