NSString包含字符串崩溃

Asa*_*evo 70 nsstring ios

我正在尝试根据其中一个字符串字段过滤数组.

nameLower和filterLower都有NSString值,但我一直得到:

__NSCFString containsString:]: unrecognized selector sent to instance 0x7f876b79e160

-(void) filterFriendsArray:(NSString*)filter {
    [_filteredFriendsArray removeAllObjects];
    for (FacebookUser* user in _friendsArray)
    {
        NSString* nameLower = [user.user.name lowercaseString];
        NSString* filterLower = [filter lowercaseString];
        if ([nameLower containsString:filterLower])
            [_filteredFriendsArray addObject:user];
    }
    _displayedFriendsArray = _filteredFriendsArray;
}
Run Code Online (Sandbox Code Playgroud)

w0m*_*bat 119

如果您希望代码在iOS 7和iOS 8上运行,则应使用其中一个rangeOfString调用.基本上,如果返回的范围的长度为零,则子串不存在.

/* These methods return length==0 if the target string is not found. So, to check for containment: ([str rangeOfString:@"target"].length > 0).  Note that the length of the range returned by these methods might be different than the length of the target string, due composed characters and such.
*/
- (NSRange)rangeOfString:(NSString *)aString;
- (NSRange)rangeOfString:(NSString *)aString options:(NSStringCompareOptions)mask;
- (NSRange)rangeOfString:(NSString *)aString options:(NSStringCompareOptions)mask range:(NSRange)searchRange;
- (NSRange)rangeOfString:(NSString *)aString options:(NSStringCompareOptions)mask range:(NSRange)searchRange locale:(NSLocale *)locale NS_AVAILABLE(10_5, 2_0);
Run Code Online (Sandbox Code Playgroud)

显然,使用rangeOfString在类别中实现containsString是微不足道的:

@implementation NSString (Contains)

- (BOOL)myContainsString:(NSString*)other {
  NSRange range = [self rangeOfString:other];
  return range.length != 0;
}

@end
Run Code Online (Sandbox Code Playgroud)

  • 在编译时看到这个问题真是太好了 (5认同)
  • 是的,检查NSNotFound的范围位置 - `return range.location!= NSNotFound;` (4认同)
  • //"on osx rangeOfString似乎返回nil而不是0如果不包含字符串"我最后一次检查时,nil等于零. (2认同)
  • 根据Apple的文档,您应该将结果与`NSNotFound`而不是'0`或`nil`进行比较. (2认同)

Dee*_*ger 8

将rangeOfString与NSNotFound进行比较

NSRange range = [self rangeOfString:other];
if(range.location != NSNotFound){
    //do something
}
Run Code Online (Sandbox Code Playgroud)