ios nsstring

ios - NSString contiene los bloqueos de String



(6)

Encapsulo mi solución en YJKit, y puede llamar - [NSString contieneString:] incluso para la versión anterior que es inferior a iOS 8.

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; }

Aquí está mi código fuente: https://github.com/huang-kun/YJKit/blob/master/YJKit/Base/Foundation/Categories/Generics/NSString%2BYJCompatible.m

Estoy tratando de filtrar una matriz de acuerdo con uno de sus campos de cadena.

Tanto nameLower como filterLower tienen un valor NSString en su interior y, sin embargo, sigo obteniendo:

__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; }


Para aquellos que encontraron esto en XLForm , asegúrese de instalar XLForm usando pods

platform :ios, ''7'' pod ''XLForm''

Ya está arreglado en 3.1

de

if ([cellClassString contains:@"/"]) { }

a

if ([cellClassString rangeOfString:@"/"].location != NSNotFound) { }


Si desea que su código funcione tanto en iOS 7 como en iOS 8, debe usar una de las llamadas rangeOfString. Básicamente, si el rango devuelto tiene una longitud de cero, la subcadena no está allí.

/* 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);

Obviamente, es trivial implementar contieneString en una categoría usando rangeOfString:

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


Versión rápida de la respuesta dada por w0mbat:

extension NSString { func compatibleContainsString(string: NSString) -> Bool{ let range = self.rangeOfString(string as String) return range.length != 0 } }


compare rangeOfString con NSNotFound

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


Use lo siguiente:

if (![[NSString class] respondsToSelector:@selector(containsString)]) { //ios 7 NSRange range = [mystring rangeOfString:other]; if(range.location != NSNotFound){ //do something } } else //for iOS 8 { if ([mystring containsString: other]) { //do something } }