質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
Swift

Swiftは、アップルのiOSおよびOS Xのためのプログラミング言語で、Objective-CやObjective-C++と共存することが意図されています

Swift 2

Swift 2は、Apple社が独自に開発を行っている言語「Swift」のアップグレード版です。iOSやOS X、さらにLinuxにも対応可能です。また、throws-catchベースのエラーハンドリングが追加されています。

Q&A

解決済

2回答

2809閲覧

JSONデータパース時のエラー

sori-

総合スコア37

Swift

Swiftは、アップルのiOSおよびOS Xのためのプログラミング言語で、Objective-CやObjective-C++と共存することが意図されています

Swift 2

Swift 2は、Apple社が独自に開発を行っている言語「Swift」のアップグレード版です。iOSやOS X、さらにLinuxにも対応可能です。また、throws-catchベースのエラーハンドリングが追加されています。

0グッド

0クリップ

投稿2016/02/11 13:07

環境
swift2.0
xcode7

現在教材を参考にし、Newsサイトを作成しています。

以下で実行した場合、
Thread 6: EXC_BAD_INSTRUCTION(code=EXC_l386_INVOP.subcode=0x0)
のエラーが出ます。
プログラムは写経したもので、どこで何をしているかは少しは理解できますが、行き詰まりました。
パースしたのものサイズが大きく、オーバーフローしているためエラーが出ているのでしょうか?
do try を使用し、エラーハンドリングできていると思っていますが、実行時エラーが出ます。
初心者のため、そこが問題なのかも怪しいですが、
解決方法をご教授いただければ助かります。

swift

1import UIKit 2 3class ViewController: UITableViewController { 4 var entries = NSArray() 5 6 let newsUrlString = "http://ajax.googleapis.com/ajax/services/feed/load?v=1.0&q=http://rss.itmedia.co.jp/rss/2.0/news_bursts.xml&num=8" 7 8 @IBAction func refresh(sender: AnyObject) { 9 let url = NSURL(string: newsUrlString)! 10 11 let task = NSURLSession.sharedSession().dataTaskWithURL(url, completionHandler: { data,response, error in 12 13 do { 14 // JSONデータを辞書に変換する 15 let dict = try NSJSONSerialization.JSONObjectWithData(data!, 16 options: NSJSONReadingOptions.MutableContainers) as! NSDictionary 17 18 // /responseData/feed/entriesを取得する 19 guard let responseData = dict["responseData"] as? NSDictionary 20 else {return} 21 guard let feed = responseData["feed"] as? NSDictionary else {return} 22 guard let entries = feed["entries"] as? NSArray else {return} 23 self.entries = entries 24 } catch {} 25 // メインスレッドにスイッチする 26 dispatch_async(dispatch_get_main_queue(), { 27 // テーブルビューを更新する 28 self.tableView.reloadData() 29 }) //in complitionHandler 30 }) 31 task.resume() 32 } 33 34 override func viewDidLoad() { 35 super.viewDidLoad() 36 // Do any additional setup after loading the view, typically from a nib. 37 } 38 39 override func tableView(tableView: UITableView, numberOfRowsInSection section: Int) -> Int { 40 return entries.count 41} 42 43 override func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell { 44 let cell = tableView.dequeueReusableCellWithIdentifier("news")! as 45 UITableViewCell 46 47 let entry = entries[indexPath.row] as! NSDictionary 48 49 cell.textLabel?.text = entry["title"] as? String 50 51 return cell 52 } 53} 54

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答2

0

ベストアンサー

swiftのtry, catchは例外を拾うものではありません。

例外の原因はdataが取れていないためです。newsUrlStringのhttp:https:に変更して下さい。
これについては下記の記事を参照して下さい。
iOS 9 で追加された App Transport Security の概要

投稿2016/02/12 00:41

編集2016/02/15 12:47
fuzzball

総合スコア16731

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

sori-

2016/02/15 12:46

ご回答いただきありがとうございました。 httpsに変更することで実行することが出来ました。 ありがとうございました。
guest

0

そのエラーが発生した時に
「App Transport Security has blocked a cleartext HTTP (http://) resource load」
というエラーメッセージがXcodeのOutputウインドウに出ているのであれば、
http://mushikago.com/i/?p=6150
等を参考にしてATSの対応をしてください。

これとは別のエラーでしたら、どの行でEXC_BAD_INSTRUCTIONが発生しているのかと
Outputウインドウに出力されているメッセージ内容を追記してください。

投稿2016/02/12 00:38

TakeOne

総合スコア6299

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

sori-

2016/02/15 12:47

ご回答いただきありがとうございました。 httpsに変更することで実行できました。 ご回答いただいたのも今後の参考にさせていただきます。 ありがとうございました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問