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

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

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

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

Q&A

解決済

2回答

1408閲覧

Swift Filter Like文 あいまい検索(部分一致)について

ataru2222

総合スコア272

Swift

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

0グッド

0クリップ

投稿2022/08/25 11:53

編集2022/08/28 14:03

実現したいこと

Swiftでのあいまい検索(部分一致)

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

現在Swiftでのあいまい検索(部分一致)の機能を実装したいと思っているのですが
他の言語にあるような Like "*" & target & "*" のようなことってできますか?

下のようなコードで色々試してみたのですが入る値が空欄の場合は全件取得したいです。
SwiftでFilterの部分一致の機能を実装するにはどのように書いたら良いでしょうか?

該当のソースコード

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 //★★★★★の部分をLike "*" & target & "*"のような条件式にしたい 16 csvArray = dataArray.filter{$0[0] == "1"} //★★★★★ 17 print(csvArray) 18 19 } 20 21 22} 23

試したこと

・Swift Like文 あいまい検索等のキーワードで調べるも分かりませんでした。
・Like "*" & target & "*" Likeが使えずエラー
・== "*" & target & "*" ワイルドカードが機能していないので0件
・!= "" は全件取得はできたのですが、あいまい検索ではないので却下

※ワイルドカードの半角がここでは表示できなかったので全角にしてあります。

こちらについて詳しい方いらっしゃいましたら、ご教授願います。
よろしくお願いいたします。

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

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

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

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

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

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

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

ataru2222

2022/08/25 12:16

hoshi様早速ありがとうございます。 csvArray = dataArray.filter{$0[0].contains("1")} でも検索できるようになったのですが、 csvArray = dataArray.filter{$0[0].contains("")} や csvArray = dataArray.filter{$0[0].contains("**")} では全件取得できないです。 他の言語のワイルドカードのようなものの使い方ってできるのでしょうか?
hoshi-takanori

2022/08/25 17:46

Swift では contains("") は false になるようですね。(いま知った…。) ってことは dataArray.filter { target.isEmpty || $0[0].contains(target) } かなぁ。
ataru2222

2022/08/26 11:58

できました!!! SwiftのLike文めちゃくちゃ難しいですね(笑) filterの条件もこんな書き方ができることも勉強になりました。 いつもいつも本当にありがとうございます。
guest

回答2

0

正規表現を使って書いてみました。

iOS 16からはもう少しシンプルに書けそうです。
Swift: iOS16から新しく利用できるRegex【WWDC 2022】 / fuwamaki media

swift

1let targets = ["0", "1", "2", ""] 2 3let dataArray = [ 4 ["1", "1さん"], 5 ["2", "2さん"], 6 ["100", "100さん"], 7 ["111", "111さん"], 8 ["321", "321さん"], 9 ["999", "999さん"], 10 ["teratail", "寺尾さん"], 11] 12 13targets.forEach { target in 14 print("Target: \"\(target)\"") 15 16 let regex = try! NSRegularExpression(pattern: ".*\(target)") 17 let csvArray = dataArray.filter { 18 regex.firstMatch(in: $0[0], range: NSRange(location: 0, length: $0[0].length)) != nil 19 } 20 21 print(" ", csvArray) 22}

出力

text

1Target: "0" 2 [["100", "100さん"]] 3Target: "1" 4 [["1", "1さん"], ["100", "100さん"], ["111", "111さん"], ["321", "321さん"]] 5Target: "2" 6 [["2", "2さん"], ["321", "321さん"]] 7Target: "" 8 [["1", "1さん"], ["2", "2さん"], ["100", "100さん"], ["111", "111さん"], ["321", "321さん"], ["999", "999さん"], ["teratail", "寺尾さん"]]

投稿2022/08/27 04:26

編集2022/08/27 04:28
fuzzball

総合スコア16731

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

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

ataru2222

2022/08/28 13:43

fazzball様 正規表現だとこのようになるのですね。 そもそもこんな書き方もできるのですね(笑) 私のような未熟者にはSwiftの情報がまだまだ薄くきついところがあるので、本当に助かりました。 ありがとうございました。
guest

0

自己解決

hoshi-takanoriさんのアドバイスのもと解決できました。
SwiftのLike文、思っていたコードより100倍難しい・・・(涙)

以下のようにすることで
・値が入ったら、その値を検索
・空欄なら全件取得
を実現できます。

dataArray.filter { target.isEmpty || $0[0].contains(target) }

投稿2022/08/26 12:02

ataru2222

総合スコア272

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問