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

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

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

Xcodeはソフトウェア開発のための、Appleの統合開発環境です。Mac OSXに付随するかたちで配布されています。

Swift

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

配列

配列は、各データの要素(値または変数)が連続的に並べられたデータ構造です。各配列は添え字(INDEX)で識別されています。

Q&A

解決済

2回答

2680閲覧

Swift3 NSCFDictionary型のデータから各要素を個別に取得したい

acidwaver

総合スコア10

Xcode

Xcodeはソフトウェア開発のための、Appleの統合開発環境です。Mac OSXに付随するかたちで配布されています。

Swift

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

配列

配列は、各データの要素(値または変数)が連続的に並べられたデータ構造です。各配列は添え字(INDEX)で識別されています。

0グッド

0クリップ

投稿2016/11/23 13:06

Swift3で、jsonから読み込んだNSArrayの中身をfor inループでパースしたいと考えているのですが、添字をつけるだけではデータが取得できないことを知りました。

print(String(describing: type(of: items))) for item in items as! NSArray{ print(String(describing: type(of: item))) print(item) }

このようなソースでは

__NSCFArray __NSCFDictionary { id = s01; "name," = ""; "image" = "i01.jpg"; "original_file" = "i01.jpg"; x = "1041.1"; y = "874.1"; height = 1920; width= 1080; } itemsには__NSCFDictionaryが入っています。 __NSCFDictionary { id = s02; "name," = "second"; "image" = "i02.jpg"; "original_file" = "i02.jpg"; ・ ・ ・

のようにデータが取得できているのですが、ループ内で

print(item["scene_item_no"] as String) print(String(item["scene_item_no"])) print((item as AnyObject).scene_item_no)

このように添え字をつけたりドットシンタックス指定しても

Type 'NSFastEnumeration Iterator.Element' (aka ''any) has no subscript members

とエラー表示が出てビルドすることができません。

添字の指定方法をご存じの方はいらっしゃいませんでしょうか。
ご教示お願い致します。

環境
macos Sierra
xcode 8.1
swift 3.0

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

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

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

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

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

guest

回答2

0

自己解決

丸一日悩みに悩みましたが、何とか解決できました。
NSDictionaryで構成されたNSArrayは「メンバがDictionary(辞書)型に定義されたArray(配列)型」としてキャストできることが分かりました。

for item in items as! [[String:Any]]{
print(item["name"] as! String)
print(item["image"] as! String)
print(item["scene_item_no"] as! String)
}

こうすることで、forループをイテレータとして配列から辞書型データを取り出すことができるため、取り出した辞書型データから添え字でアクセスできるようになりました。

分かってしまえば。。。という内容ではありましたが、swift初心者の自分には理解しづらい内容でしたのでとても勉強になりました。

投稿2016/11/24 01:46

acidwaver

総合スコア10

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

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

fuzzball

2016/11/24 02:31 編集

キャストのタイミングは、 result = try NSJSONSerialization.JSONObjectWithData(中略) as! [[String:Any]] ではないでしょうか? ‥と思ったのですが、resultとitemsって別物?
acidwaver

2016/11/24 03:25

resultの中に、いろいろなデータが入っている中の一つがitemsという状況でした。 だから。。。というわけではないと思いますが(どんなJSONが落ちてくるかは外部API側の仕様なので)このタイミングで[String:Any]や[[String:Any]]にキャストしようとしてもxcode側でCannot assin~のエラーとなっていました。 ※ xcode側で弾かれなくてもNSJSONSerialization.JSONObjectWithDataの際に [[String:Any]]としても取得できるデータもitemsはNSArrayとなる気がしますね。 ちなみにこちらのコードはswift2では動いていたもので、swift3にconvartした際に「Type 'NSFastEnumeration Iterator.Element' (aka ''any) has no subscript members」 エラーを大量発生させたものとなります。 昨日いろいろ調べたのですが、どうやらNSDictionaryとNSArrayの値型がSwift3になってAnyObjectからAnyに変更されたため、swift2からswift3にバージョンアップした際にはこのあたりに気を付けて手動で変更しなければいけない部分のようです
guest

0

swift

1print(item["scene_item_no"] as! String)

これで拾えないでしょうか?

投稿2016/11/23 23:44

fuzzball

総合スコア16731

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

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

acidwaver

2016/11/24 01:18

as!で文字列にキャストをしても、xcodeのエディタ側で Type 'NSFastEnumeration Iterator.Element' (aka ''any) has no subscript members と出てしまいビルドすることができない状態でした。 エラーメッセージを直訳すると、NSFastEnumerationのイテレータエレメントには添字メンバーがないという意味のようなのでNSCFDictionary型は添字で指定できる型ではないものなのだと解釈しているのですが、だとするとどうやって各要素を取得すればよいのかと途方に暮れている状態です。。。
fuzzball

2016/11/24 01:26

JSONのパースには何を使っているのでしょうか?
fuzzball

2016/11/24 01:38

すみません、上の質問は無視して下さい。「ループ内」とありますが、どのようなループでしょうか?
acidwaver

2016/11/24 01:51

すみません。説明が足りなかったように思います。 ちなみにjsonのパースにはNSJSONSerializationを使っていました。 result = try NSJSONSerialization.JSONObjectWithData(data!, options: .MutableLeaves) as? NSDictionary としてNSDictionaryにキャストした結果から、各メンバを取得することはできていたのですが、その中にNSArray型のデータが存在し、その内容をfor文で処理して内の情報を取得したかったのが今回の目的でした。 この問題につきましては自己解決してしまいましたが、ご意見いただきましてありがとうございました。とてもうれしかったです。
fuzzball

2016/11/24 02:28

ループについては質問に書いてありましたね。すみません。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問