1. ホーム
  2. ios

[解決済み] Swiftで述語を使う

2023-01-13 12:20:35

質問

私は最初のアプリのために、ここのチュートリアル(Swiftの学習)をやっています。 http://www.appcoda.com/search-bar-tutorial-ios7/

この部分(Objective-Cのコード)で行き詰っています。

- (void)filterContentForSearchText:(NSString*)searchText scope:(NSString*)scope
{
    NSPredicate *resultPredicate = [NSPredicate predicateWithFormat:@"name contains[c]         %@", searchText];
    searchResults = [recipes filteredArrayUsingPredicate:resultPredicate];
}

誰かSwiftでNSPredicateに相当するものを作る方法を教えてください。

どのように解決するのですか?

これは本当にただの構文切り替えです。OK、では、このメソッド呼び出しがあります。

[NSPredicate predicateWithFormat:@"name contains[c] %@", searchText];

Swift では、コンストラクタは "blahWith..." の部分をスキップして、クラス名を関数として使用し、そのまま引数に行くので、次のようになります。 [NSPredicate predicateWithFormat: …] は次のようになります。 NSPredicate(format: …) . (別の例として [NSArray arrayWithObject: …] は次のようになります。 NSArray(object: …) . これはSwiftのお決まりのパターンです)。

というわけで、あとはコンストラクタに引数を渡すだけです。Objective-C では、NSString リテラルは次のようになります。 @"" のように見えますが、Swift では文字列のために引用符を使用するだけです。だから、それは私たちを与えます。

let resultPredicate = NSPredicate(format: "name contains[c] %@", searchText)

そして実際、これこそ私たちがここで必要としているものなのです。

(ちなみに、他の回答では、代わりに "name contains[c] \(searchText)" . これは正しくありません。これは文字列の補間を使用しており、述語の書式設定とは異なるため、一般的にはこのために動作しません)。