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

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

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

iOSとは、Apple製のスマートフォンであるiPhoneやタブレット端末のiPadに搭載しているオペレーションシステム(OS)です。その他にもiPod touch・Apple TVにも搭載されています。

Swift 2

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

Q&A

解決済

1回答

3472閲覧

【iOS】【Swift】エラーが出たときに例外処理をしたい。NSDataの例外処理。

mmmm

総合スコア54

iOS

iOSとは、Apple製のスマートフォンであるiPhoneやタブレット端末のiPadに搭載しているオペレーションシステム(OS)です。その他にもiPod touch・Apple TVにも搭載されています。

Swift 2

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

0グッド

0クリップ

投稿2017/01/05 00:57

###前提・実現したいこと
エラーが出たときに例外処理をしたい。
任意のURLをNSDataからエンコーディングする際に、

  • エラーが出ないNSData
  • エラーが出るURL

があります。
エンコーディングがうまくいかないときにアプリが止まってしまいます。
do try catch の例外処理はアプリが止まってしまうようなエラーは対象外のようでどう対応すればいいのかアドバイスいただければありがたいです。

可能であればエラーの出るURLのエンコーディングのエラーをなくす。
上記は難しいそうなのでエラーが出たときにはアラートを出すなど別の処理をしたい。

###発生している問題・エラーメッセージ

override func viewDidLoad() { super.viewDidLoad() self.test() } func test() { do { try self.method() print("成功") } catch { print(error) print("不明なエラーが発生しました。") } } func method() throws{ //エラーがでないURL //let urlString = " http://headlines.yahoo.co.jp/hl?a=20170104-00511411-soccerk-socc" //エラーが出るURL //http://www.yahoo.co.jp/ //https://www.google.co.jp/search?sourceid=chrome-psyapi2&ion=1&espv=2&ie=UTF-8&q=%E3%83%AF%E3%83%B3%E3%83%94%E3%83%BC%E3%82%B9&oq=%E3%83%AF%E3%83%B3%E3%83%94%E3%83%BC%E3%82%B9&aqs=chrome..69i57j0l5.1662j0j4 let urlString = "https://www.google.co.jp/search?q=%E8%80%83%E5%AF%9F%E7%8E%8B&oq=%E8%80%83%E5%AF%9F%E7%8E%8B&aqs=chrome..69i57j69i65j69i59j69i61l3.3739j0j7&sourceid=chrome&ie=UTF-8" let encString = urlString.addingPercentEncoding(withAllowedCharacters: NSCharacterSet.urlQueryAllowed) let url = Foundation.URL(string: encString!) let data = NSData(contentsOf: url! as URL) //ここでエラー アプリが止まってしまいます let str = (NSString(data:data as! Data, encoding:String.Encoding.utf8.rawValue) as? String)! }

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

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

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

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

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

guest

回答1

0

ベストアンサー

!を付けてForced Unwrappingしないようにしましょう。
ようするに、ちゃんとnilチェックしましょう、ということです。

【追記】

ちなみに、

swift

1let str = (NSString(data:data as! Data, encoding:String.Encoding.utf8.rawValue) as? String)!

を、

swift

1let str = String(describing: NSString(data:data, encoding:String.Encoding.utf8.rawValue)!)

ととすると落ちなくなりませんか?( as! Dataは意味が無いので削除しました)

投稿2017/01/05 01:06

編集2017/01/05 01:51
fuzzball

総合スコア16731

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

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

mmmm

2017/01/05 10:58

最初にアドバイスいただいたように1つ1つnilチェックとキャストしたところ問題が解決できました!ありがとうございます!! ただas! Data なしではXcodeに as! Dataをつけろと言われて実行できませんでした。
fuzzball

2017/01/05 12:07

あー、すみません。 NSData(contentsOf: url! as URL) ではなく Data(contentsOf: url! as URL) にして下さい。 わざわざNSDataで作ってDataに変換する必要はないです。 また、urlもURLで作っているので as URL とする必要は無いはずです。
mmmm

2017/01/07 04:15

ありがとうございます。キャストとnilチェックをなんとなくやっていたのですが再度理解して一個一個やる必要があるということもわかって非常にありがたいアドバイスでした!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問