首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >NSString containsString崩溃

NSString containsString崩溃
EN

Stack Overflow用户
提问于 2014-10-17 01:28:32
回答 4查看 24.9K关注 0票数 70

我正在尝试根据数组的一个字符串字段来过滤数组。

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

代码语言:javascript
复制
__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;
}
EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2014-10-17 08:43:15

如果你想让你的代码在iOS 7和iOS 8上运行,你应该使用其中的一个rangeOfString调用。基本上,如果返回的范围长度为零,则不存在子字符串。

代码语言:javascript
复制
/* 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);

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

代码语言:javascript
复制
@implementation NSString (Contains)

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

@end
票数 119
EN

Stack Overflow用户

发布于 2015-05-15 19:06:55

比较rangeOfString和NSNotFound

代码语言:javascript
复制
NSRange range = [self rangeOfString:other];
if(range.location != NSNotFound){
    //do something
}
票数 8
EN

Stack Overflow用户

发布于 2016-08-05 17:39:47

我将我的解决方案封装在YJKit中,您可以调用-NSString containsString:即使是iOS 8以下的旧版本。

代码语言:javascript
复制
bool _yj_streq(const char *str1, const char *str2, size_t length) {
    for (int i = 0; i < length; i++) {
        if (*str1++ != *str2++) {
            return false;
        }
    }
    return true;
}

- (BOOL)yj_containsString:(NSString *)string {

    NSAssert(string != nil, @"*** -[%@ containsString:] can not use nil argument.", [self class]);

    size_t len1 = (size_t)self.length;
    size_t len2 = (size_t)string.length;

    if (len1 == 0 || len2 == 0 || len1 < len2) {
        return NO;
    }

    const char *str1 = self.UTF8String;
    const char *str2 = string.UTF8String;

    for (size_t i = 0; i <= len1 - len2; i++) {
        const char *substr1 = str1 + i;
        if (_yj_streq(substr1, str2, len2)) {
            return YES;
        } else {
            continue;
        }
    }

    return NO;
}

这是我的源代码:https://github.com/huang-kun/YJKit/blob/master/YJKit/Base/Foundation/Categories/Generics/NSString%2BYJCompatible.m

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/26410420

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档