Swift の String クラスの contains メソッドは「文字列中に指定の部分文字列が含まれるかどうか」を判定しますが、空文字を指定した場合は true ではなく false が返ります。
※ 同じ部分文字列検索メソッドでも hasPrefix は空文字でも true を返します
通常の利用だとわざわざ空文字で調べることはないと思うので問題ないのですが、リスト表示の項目のフィルタリングの際には困ることがあります。
とあるデータを検索ワードとして入力した文字でフィルタリングする画面を考えます。
SwiftUI だと、フィルタリングは下記のように行うことができます。
List {
ForEach(data.filter{$0.name!.contains(keyword)},
id: \.self) { datum in
...
この場合検索ワードはデフォルトだと空文字になるので、下記のように初回画面表示時は結果が空になってしまいます。
もちろん入力すれば結果がリアルタイムで表示されますが、これだとユーザにデータが存在しないと思われるかもしれません。
そこで、「基本は conteins と同じ挙動だが、空文字のときは true を返す」メソッドを作成します。
String クラスを extension してメソッドを追加します。
extension String {
func containsWithEmpty(_ keyword: String) -> Bool {
if keyword.isEmpty {
return true
}
return self.contains(keyword)
}
}
最初に isEmpty で空判定を行って、その後に contains を呼び出しています。
そして作成した containsWithEmpty メソッドを使ってリストのフィルタリング処理を書き直します。
List {
ForEach(data.filter{$0.name!.containsWithEmpty(keyword)},
id: \.self) { datum in
...
これでデフォルトの空文字状態ですべてのデータが表示されるようになりました。
ちなみに、キャプチャで使ってる画面は現在開発中のアプリのものです。