10

Arrays オブジェクト内の検索語を検索する NSPredicate を作成するにはどうすればよいですか? うまく説明できないので、例を挙げます。

NSArray *array = @[@"Test String: Apple", @"Test String: Pineapple", @"Test String: Banana"];
NSString *searchText = @"Apple";
NSPredicate *predicate = [NSPredicate predicateWithFormat:@"SELF CONTAINS[cd] %@", searchText];
NSArray *filteredArray = [array filteredArrayUsingPredicate:predicate];
NSLog(@"filteredArray: %@", filteredArray);

// filteredArray: (
//    "Test String: Apple",
//    "Test String: Pineapple"
// )

しかし、使用するNSString *searchText = @"Test Str Appl";と結果はゼロになります。この文字列に対して同じ結果を一致させたいと思います。

私が探しているのは、Xcode の「すばやく開く」メニューに似た検索機能です。検索文字列が正しく表現されているかどうかは問題ではなく、文字が一致として正しい順序になっているだけです。それが理にかなっていることを本当に願っています。

クイック メニューを開く

4

2 に答える 2

20

LIKE述語での文字列比較では、ワイルドカード*と を使用できます。?ここで、 は*0 個以上の文字に一致します。したがって、検索テキストを次のように変換すると、

NSString *searchWithWildcards = @"*T*e*s*t* *S*t*r*A*p*p*l*";

*このようなものを使用して、最初のすべての文字の間、および元の検索テキストの最後にa を挿入することによって

NSMutableString *searchWithWildcards = [NSMutableString stringWithFormat:@"*%@*", self.searchField.text];
if (searchWithWildcards.length > 3)
    for (int i = 2; i < self.searchField.text.length * 2; i += 2)
        [searchWithWildcards insertString:@"*" atIndex:i];

その後、使用できます

[NSPredicate predicateWithFormat:@"SELF LIKE[cd] %@", searchWithWildcards];

述語は、指定された順序で文字を検索します。その間に他の任意の文字が入ります。


変換は、たとえば次のコードで実行できます。

NSMutableString *searchWithWildcards = [@"*" mutableCopy];
[searchText enumerateSubstringsInRange:NSMakeRange(0, [searchText length])
                   options:NSStringEnumerationByComposedCharacterSequences
                usingBlock:^(NSString *substring, NSRange substringRange, NSRange enclosingRange, BOOL *stop) {
                    [searchWithWildcards appendString:substring];
                    [searchWithWildcards appendString:@"*"];
                }];
于 2013-02-26T14:26:25.057 に答える
0

私は objcC をうまく読めないので、独自のワイルドカード関数を書きました。どうぞ:

スイフト5

CoreData は初期化された配列にフェッチされます

var originalArray: [NSManagedObject] = []


extension myViewController: UISearchResultsUpdating {
    func updateSearchResults(for searchController: UISearchController) {
        filteredArray.removeAll(keepingCapacity: true)
        if searchController.searchBar.text!.isEmpty {
            filteredArray = originalArray
        } else {
            let filter = searchController.searchBar.text!
            var filterWithWildcards = ""
            for i in 0 ..< filter.length {
                if i == 0 {
                    filterWithFormat = "*"
                }
                filterWithFormat += filter[i] + "*"
            }
            print("filter: \(filter); filterWithWildcards: \(filterWithWildcards)") // filter: Mxmstrmnn; filterWithFormat: *M*x*m*s*t*r*m*n*n*
            myPredicate = NSPredicate(format: "EnterYourAttributeNameOfCoreDataEntity LIKE[c] %@", filterWithWildcards)
            let array = (people as NSArray).filtered(using: myPredicate!)
            filteredArray = array as! [NSManagedObject]
        }
        myTableView.reloadData()
}}

filteredArray の結果は、文字の順序を保持している限り、Max Mustermannを見つけます。

filter[i] のインデックス文字を取得するには、ここから文字列拡張機能を使用しますhttps://stackoverflow.com/a/26775912/12035498

于 2020-02-29T00:55:01.970 に答える