9

NSPredicateを使用して、大文字と小文字を区別しない、発音区別符号を区別しない、空白を区別しない2つの文字列を照合する必要があります。

述語は次のようになります。

[NSPredicate predicateWithFormat:@"Key ==[cdw] %@", userInputKey];

'w'修飾子は、私が使用したいものを表現するために発明されたものです。

データソースの「キー」値にも空白が含まれている可能性があるため、単にトリミングすることはできませuserInputKeyん(これらの空白が必要なため、事前にトリミングすることはできません)。

たとえば、userInputKey「abc」が与えられた場合、述語はすべてに一致する必要があります

{"abc"、 "ab c"、 "a BC"}
等々。「 aBC」が与えられた場合userInputKey、述語は上記のセットのすべての値とも一致する必要があります。

これはそれほど難しいことではありませんね。

4

2 に答える 2

13

このようなものを定義するのはどうですか?

+ (NSPredicate *)myPredicateWithKey:(NSString *)userInputKey {
    return [NSPredicate predicateWithBlock:^BOOL(NSString *evaluatedString, NSDictionary *bindings) {
        // remove all whitespace from both strings
        NSString *strippedString=[[evaluatedString componentsSeparatedByCharactersInSet:[NSCharacterSet whitespaceCharacterSet]] componentsJoinedByString:@""];
        NSString *strippedKey=[[userInputKey componentsSeparatedByCharactersInSet:[NSCharacterSet whitespaceCharacterSet]] componentsJoinedByString:@""];
        return [strippedString caseInsensitiveCompare:strippedKey]==NSOrderedSame;
    }];
}

次に、次のように使用します。

NSArray *testArray=[NSArray arrayWithObjects:@"abc", @"a bc", @"A B C", @"AB", @"a B d", @"A     bC", nil];
NSArray *filteredArray=[testArray filteredArrayUsingPredicate:[MyClass myPredicateWithKey:@"a B C"]];               
NSLog(@"filteredArray: %@", filteredArray);

結果は次のとおりです。

2012-04-10 13:32:11.978 Untitled 2[49613:707] filteredArray: (
    abc,
    "a bc",
    "A B C",
    "A     bC"
)
于 2012-04-10T12:23:22.793 に答える
2

スウィフト4

func ignoreWhiteSpacesPredicate(id: String) -> NSPredicate {
    return NSPredicate(block: { (evel, binding) -> Bool in
        guard let str = evel as? String else {return false}
        let strippedString = str.components(separatedBy: CharacterSet.whitespaces).joined(separator: "")
        let strippedKey = id.components(separatedBy: CharacterSet.whitespaces).joined(separator: "")
        return strippedString.caseInsensitiveCompare(strippedKey) == ComparisonResult.orderedSame
    })
}

例:

let testArray:NSArray =  ["abc", "a bc", "A B C", "AB", "a B d", "A     bC"]
let filteredArray = testArray.filtered(using: ignoreWhiteSpacesPredicate(id: "a B C")) 

結果:

["abc"、 "a bc"、 "AB C"、 "A bC"]

于 2018-05-12T04:14:19.030 に答える