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

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

新規登録して質問してみよう
ただいま回答率
85.35%
多次元配列

1次元配列内にさらに配列を格納している配列を、多次元配列と呼びます。

iOS

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

Swift

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

Q&A

解決済

2回答

1196閲覧

Plistに登録している値を配列に入れたい

perrito_20

総合スコア2

多次元配列

1次元配列内にさらに配列を格納している配列を、多次元配列と呼びます。

iOS

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

Swift

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

0グッド

0クリップ

投稿2020/07/20 04:05

編集2020/07/20 08:45

下記のようにPlistに登録している値を配列に入れて後の処理で使用したいと考えております。
イメージ説明
例えば、各マスタ(Master2,Master3)内の各項目(point1〜point4)にそれぞれ登録されているltd,lngの値を
[[Double]]=[[Master2のpoint1のltdの値, Master2のpoint1のlngの値],
[Master2のpoint2のtdの値, Master2のpoint2のlngの値],
[Master2のpoint3のtdの値, Master2のpoint3のlngの値],
[Master2のpoint4のtdの値, Master2のpoint4のlngの値],
[Master3のpoint1のltdの値, Master3のpoint1のlngの値],
[Master3のpoint2のtdの値, Master3のpoint2のlngの値],
[Master3のpoint3のtdの値, Master3のpoint3のlngの値],
[Master3のpoint4のtdの値, Master3のpoint4のlngの値]]のように配列に格納したいと考えております。

let plistPath = Bundle.main.path(forResource: "properties", ofType:"plist" )
let plistmst= NSDictionary(contentsOfFile: plistPath) as! Dictionary<String, Any>

のようにして取り出そうとしているのですが、ここから上記のように配列に入れる方法で
手こずっております。

どなたかアドバイスを頂けないでしょうか。

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

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

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

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

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

MasakiHori

2020/07/20 08:27

長くてすみませんが、あまりにも疑問点が多いので質問します。 1. Apple Property Listを使用するのはなぜですか? SwiftでPlistを使うのは若干面倒くさいのですけど、なぜPlistを使うのですか? 2. plistでDoubleである数値をStringにしているのはなぜですか? プログラム上でDoubleとして使用するのになぜわざわざStringにしているのかが分かりません 3. なぜ多重の入れ子のDictionayにしているのですか? プログラム上で配列の配列として利用するのになぜ辞書の辞書の辞書という3重の辞書としてplistを作成しているのですか?
perrito_20

2020/07/20 08:46

MasakiHori様 色々とご指摘ありがとうございます。 >1. Apple Property Listを使用するのはなぜですか? >SwiftでPlistを使うのは若干面倒くさいのですけど、な>ぜPlistを使うのですか? →ソース上にベタで書くのを避けたいため、プロパティファイルの用に使うことが出来るであろうと判断したPlistを利用しました。 >2. plistでDoubleである数値をStringにしているのはな>ぜですか? >プログラム上でDoubleとして使用するのになぜわざわ>ざStringにしているのかが分かりません →こちらはDoubleで扱っていましたが、途中で1の理由でPlistにしたのですが、Doubleがなかったため一旦Stringにして試しているところでした。 >3. なぜ多重の入れ子のDictionayにしているのですか? >プログラム上で配列の配列として利用するのになぜ辞>書の辞書の辞書という3重の辞書としてplistを作成し>ているのですか? →こちらは誤りです。 試行錯誤しているうちに間違えてアップしていました。 Dictionary<String, Any> が正解でした。
guest

回答2

0

ベストアンサー

Apple Property Listは使用する。構造はスクリーンショットのままとして回答します。

Plistでは数値はどのような型でもNumberを使用します。ここは変更してください。

DictionaryのイニシャライザではなくPropertyListDecoderというstructがありますのでこれを用います。
正しく使えばPlistを型を指定して読み込めます。

なお、元のデータがDictionaryなのでデータの順番は保証されません。

swift

1 func loadProperty() -> [(Double,Double)] { 2 3 typealias PListData = Dictionary<String, Dictionary<String, Dictionary<String, Double>>> 4 5 do { 6 let url = Bundle.main.url(forResource: "properties", withExtension: "plist")! 7 let d = try Data(contentsOf: url) 8 9 let decoder = PropertyListDecoder() 10 11 let dd = try decoder.decode(PListData.self, from: d) 12 13 return dd.values.flatMap { dict0 in 14 15 dict0.values.compactMap { dict1 -> [Double]? in 16 17 let val = (dict1["ltd"], dict1["lng"]) 18 guard let val0 = val.0, let val1 = val.1 else { return nil } 19 return [val0, val1] 20 } 21 } 22 } 23 catch { 24 25 print(error) 26 fatalError() 27 } 28 }

投稿2020/07/20 11:58

編集2020/07/21 00:52
MasakiHori

総合スコア3391

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

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

perrito_20

2020/07/20 13:43

MasakiHori様 ご回答ありがとうございます。 1箇所私の記載で肝心なところが間違っておりました。 Plistから配列に落としたいのは下記の配列でした。 [[[Master2のpoint1のltdの値, Master2のpoint1のlngの値], [Master2のpoint2のtdの値, Master2のpoint2のlngの値], [Master2のpoint3のtdの値, Master2のpoint3のlngの値], [Master2のpoint4のtdの値, Master2のpoint4のlngの値]], [[Master3のpoint1のltdの値, Master3のpoint1のlngの値], [Master3のpoint2のtdの値, Master3のpoint2のlngの値], [Master3のpoint3のtdの値, Master3のpoint3のlngの値], [Master3のpoint4のtdの値, Master3のpoint4のlngの値]]] ご回答頂いたソースをもとに修正を加えてみようと思います。
MasakiHori

2020/07/21 00:52

すみません 配列の配列よりタプルの配列の方がまだましだなぁと思いながら書いてたらそのままコードに落ちてました 修正します
guest

0

配列に入れる方法で手こずっております

配列にしたいなら、plistのTypeをArrayにして下さい。

【追記】

キャストが一段足りていないので「手こずって」いるのかも知れません。
Dictionary<String, Dictionary<String, Any>>
Dictionary<String, Any>

Dictionary<String, Dictionary<String, Dictionary<String, String>>>

投稿2020/07/20 07:57

編集2020/07/20 08:50
fuzzball

総合スコア16733

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

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

perrito_20

2020/07/20 08:44

fuzzball様 御回答ありがとうございます。 単純にarrayにすれば済む話ですが、どの要素が何を表しているかが名称で分かればと思い、そのようにしました。 arrayで検討してみます。
fuzzball

2020/07/20 08:52

>>単純にarrayにすれば済む話ですが それならば、なぜ質問に「配列に入れる方法で手こずっております」と書いたのでしょうか? Dictionaryでやる場合の修正案を回答に追記しました。
perrito_20

2020/07/20 12:39

fuzzball様 ご回答ありがとうございます。 なぜかdictionaryからarrayに変換して使おうとばかり思っていました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.35%

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

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

質問する

関連した質問