2016-04-14 3 views
0

xcodeの問題に直面しています。 私は気象情報を私に与えるアプリケーションを開発しようとしています。ビルドは成功しますが、コンソールをクリックするたびに(検索、コピーなど)出力をチェックするためにxcodeがクラッシュします。次のテキストは、Appleへのレポート作成ツールから来コンソールをクリックして出力を確認すると、xcodeがクラッシュする

アプリケーション固有の情報: ProductBuildVersion:7C1002 キャッチされない例外(NSRangeException): - [__ NSCFString characterAtIndex:]:範囲または境界 のUserInfoのうちインデックス: (ヌル) ヒント:なし。ここ

は、私が実行しているコード、

override func viewDidLoad() { 
super.viewDidLoad() 

    let url = NSURL(string:"http://www.weather-forecast.com/locations/Hyderabad/forecasts/latest") 
    let task = NSURLSession.sharedSession().dataTaskWithURL(url!) { (data, response, error) -> Void in 

     if let webContent = data { 

      let decodedContent = NSString(data: webContent, encoding: NSUTF8StringEncoding) 
      //print(decodedContent) 
      let weatherSiteSourceArray = decodedContent?.componentsSeparatedByString("3 Day Weather Forecast Summary:</b><span class=\"read-more-small\"><span class=\"read-more-content\"> <span class=\"phrase\">") 
      print(weatherSiteSourceArray) 

//    if weatherSiteSourceArray?.count > 0 { 
//     
//     let weatherInfo = weatherSiteSourceArray![1] 
//     print(weatherInfo) 
//    } 
      } 
    } 
    task.resume() 


    // Do any additional setup after loading the view, typically from a nib. 
} 

かかわらずです(NSRangeException)を報告します。 - [__ NSCFString characterAtIndex:]:範囲外または範囲外のインデックスです。

私はこれがどこで起こっているのか理解できません。 私はあなたが印刷(items:Any ...)メソッドを使用してSwiftで配列を印刷できることを学んだ。

これにご協力いただければ幸いです!

答えて

0

あなたの配列に要素があり、次に2番目の要素を読み込もうとしているのを確認しています。あなたの配列にアイテムが1つしかないので、weatherSiteSourceArray [1]を選択すると、アクセスする要素2が配列の範囲外であるため、失敗します。

weatherSiteSourceArray?.count> 0 {

  let weatherInfo = weatherSiteSourceArray![1] 

かのどちらか

 if weatherSiteSourceArray?.count > 1 

または

  let weatherInfo = weatherSiteSourceArray![0] 

すなわち、最初の要素を使用するかどうかを確認私は迅速の見当がつかないし、それを前提としarrayにはゼロベースのインデックスを使います。

+1

ありがとうございました!配列を扱う際には注意が必要です。 :) 非常に感謝!ヒントのために – baconSoda

0

開始するには、どの回線がクラッシュを引き起こしているのかを正確に把握することをお勧めします。

let decodedContent = NSString(data: webContent, encoding: NSUTF8StringEncoding) 
//print(decodedContent) 
let weatherSiteSourceArray = decodedContent?.componentsSeparatedByString("3 Day Weather Forecast Summary:</b><span class=\"read-more-small\"><span class=\"read-more-content\"> <span class=\"phrase\">") 
print(weatherSiteSourceArray) 

をそして、あなたはコードのその後クラッシュしない場合、その後、あなたが行クラッシュを持ってまで、一度にあなたのコード1行でコメントしてみてください。これらの3行をコメントアウトしてみてください。

もう一つ:

let weatherSiteSourceArray = decodedContent?.componentsSeparatedByString("3 Day Weather Forecast Summary:</b><span class=\"read-more-small\"><span class=\"read-more-content\"> <span class=\"phrase\">") 

はあなたの問題を引き起こして1かもしれません:

あなたのコードを見て私は多分、このラインを推測しています。そのようなHTML文字列に基づいてコンテンツを分離しようとすると、少し危険で脆弱です。 2番目の文字列の変更(それは:-))、あなたは失ってしまった。

より良い方法は、純粋なJSONまたはXMLのデータを受信することです。

ちょっと考えて:-)

+0

ありがとう。これを覚えておいてください。 また、WebサイトのHTMLに基づいて分割することは、ある時点で変更されるため、最もスマートではありません。これはちょうど純粋なチュートリアルの視点からのものでした。注意して、あなたのアドバイスを心に留めておきます。もう一度ありがとうございます:) – baconSoda

関連する問題