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

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

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

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

Q&A

解決済

1回答

2556閲覧

Swift 二次元配列の検索して、値を詰め替えたい

ataru2222

総合スコア272

Swift

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

0グッド

0クリップ

投稿2022/06/05 00:54

実現したいこと

Swiftの二次元配列の値の検索をして、ヒットしたものを別の配列に格納したい

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

二次元配列に入れたデータを検索して、ヒットしたものを表示する配列を作りたいのですが、filter関数を使うようなのですが、上手くいかずに困っております。

エラーメッセージ

Anonymous closure argument not contained in a closure

訳:クロージャに含まれない匿名クロージャ引数

該当のソースコード

swift

1import UIKit 2 3class ViewController: UIViewController { 4 5 var csvArray: Array<Array<String>> = [] 6 var dataArray: Array<Array<String>> = [ 7 ["1","東京","男性","38","2"] 8 ,["2","東京","男性","31","2"] 9 ,["1","東京","女性","23","2"] 10 ,["3","東京","男性","20","2"] 11 ] 12 override func viewDidLoad() { 13 super.viewDidLoad() 14 15 16 csvArray = dataArray.filter($0.text == "1") 17 print(csvArray) 18 19 } 20 21 22} 23 24

試したこと

csvArray = dataArray.filter($0 == "1")
の条件式の部分を思いつくものを変更してみたのですが、上手くいきませんでした。

二次元配列の検索について、お分かりになられる方いらっしゃいましたらご教授願います。
よろしくお願いいたします。

補足情報(FW/ツールのバージョンなど)

ここにより詳細な情報を記載してください。

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

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

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

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

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

hoshi-takanori

2022/06/05 01:15

どういう結果を期待していますか?
ataru2222

2022/06/05 01:20

hoshi様 いつもありがとうございます。 今回のサンプルの場合だとcsvArrayに ["1","東京","男性","38","2"] ,["1","東京","女性","23","2"] が入る結果を期待しております。 よろしくお願いいたします。
guest

回答1

0

ベストアンサー

とりあえずこんな感じでしょうか。

swift

1csvArray = dataArray.filter { $0[0] == "1" } 2 3// 結果: [["1", "東京", "男性", "38", "2"], ["1", "東京", "女性", "23", "2"]]

まず、クロージャは普通のかっこ ( ) ではなく、波かっこ { } で囲みます。

また、クロージャの引数 $0 は配列の要素ですが、dataArray の型は Array<Array<String>> なので、その要素の型は Array<String> になります。$0 だと紛らわしい場合は、引数に名前と型を付けて次のように書くこともできます。

swift

1csvArray = dataArray.filter { (elem: Array<String>) in 2 return elem[0] == "1" 3}

そして、$0 や elem は ["1", "東京", "男性", "38", "2"] や ["2", "東京", "男性", "31", "2"] のような配列なので、その最初の要素は $0[0] や elem[0] になります。


あとは余計なお世話ですが、まず行の先頭にカンマ , が来るのは格好悪いですね。Swift では配列の最後の要素の後ろにカンマを書くことが許されてますので、次のようにするのが一般的かと。

swift

1let dataArray: Array<Array<String>> = [ 2 ["1", "東京", "男性", "38", "2"], 3 ["2", "東京", "男性", "31", "2"], 4 ["1", "東京", "女性", "23", "2"], 5 ["3", "東京", "男性", "20", "2"], // ← ここにカンマが許されるので、要素の追加が楽。 6]

また、配列の要素は使い方にもよりますが、できれば構造体などにするとすっきりするかも…。

投稿2022/06/05 01:46

編集2022/06/05 01:48
hoshi-takanori

総合スコア7895

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

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

ataru2222

2022/06/05 02:04

hoshi様 できました。 本当にいつもいつもありがとうございます。 ,(カンマ)の使い方も前置きにしてたのはSwiftではイケてないのですね(笑) まだまだ全然分からないのでしっかり勉強していきます。 本当にありがとうございました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問