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

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

新規登録して質問してみよう
ただいま回答率
85.49%
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回答

3532閲覧

実機のテストで、JSONのパースに「Ambiguous use of 'subscript'」が出る

skomatsu

総合スコア12

iOS

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

Swift 2

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

0グッド

1クリップ

投稿2016/08/24 14:08

Swift2でサーバからダウンロードしたJSONを分解して、辞書にセットするプログラムです。

Swift

1 let url = NSURL(string: "http://xxx.xxx.xxx.xxx/doc/ios/json_data.php") 2 let config = NSURLSessionConfiguration.defaultSessionConfiguration() 3 let session = NSURLSession(configuration: config) 4 let req = NSURLRequest(URL: url!) 5 6 //NSURLSessionDownloadTask is retured from session.dataTaskWithRequest 7 let task = session.dataTaskWithRequest(req, completionHandler: { 8 (data, resp, err) in 9 10 do { 11 let json:NSArray = try NSJSONSerialization.JSONObjectWithData(data!, options: NSJSONReadingOptions.MutableContainers) as! NSArray 12 13 14 15 let MonData = json[5][0] 16 let MonDataDic = MonData as! Dictionary<String, AnyObject> 17 // 月曜の時間割をセット 18 cs.mo[0] = String(MonDataDic["Class_1"]!) 19 cs.mo[1] = String(MonDataDic["Class_2"]!) 20 cs.mo[2] = String(MonDataDic["Class_3"]!) 21 cs.mo[3] = String(MonDataDic["Class_4"]!) 22 cs.mo[4] = String(MonDataDic["Class_5"]!) 23 cs.mo[5] = String(MonDataDic["Class_6"]!) 24 cs.mo[6] = String(MonDataDic["Class_7"]!) 25 cs.mo[7] = String(MonDataDic["Class_8"]!) 26 catch { 27 print(err) 28 }

このプログラムで、iOSシミュレータでは、エラーなく実行できるのですが、実機のテストだと、「Ambiguous use of 'subscript'」というエラーが出て、ビルドに失敗してしまいます。

どのような書き方をすれば良いのでしょうか。お願いします。

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

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

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

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

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

guest

回答1

0

エラーが出ている原因となっているのは、恐らくこの行かと思います。

swift

1let MonData = json[5][0]

なぜこの行でエラーが出るのかというと、jsonという変数は、ここで宣言されていて、その型はNSArrayですね。

swift

1let json:NSArray = try NSJSONSerialization.JSONObjectWithData(data!, options: NSJSONReadingOptions.MutableContainers) as! NSArray

しかし、NSArrayは要素がどのような型であるかを知りません。なので、下のようなコードの返り値の型はAnyObjectになります。

swift

1json[5]

そして、最初のjson[5][0]というコードではAnyObjectに対して配列としてアクセスしようとしているのでAmbiguous use of 'subscript'というエラーが出るのだと思います。

これを直すには、

swift

1let MonData = (json[5] as! NSArray)[0]

のように一度キャストを介して、NSArrayであることを保証した上でアクセスすればいいと思います。

しかし、なぜエミュレーターと実機で動作が違うのかはちょっと分かりません。恐らくSwiftのバージョンの違いによるものかと思いますが‥‥。

参考:

投稿2016/08/24 14:58

編集2016/08/24 15:01
MakeNowJust

総合スコア545

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

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

ただいまの回答率
85.49%

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

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

質問する

関連した質問