objective-c cocoa string

objective c - Crear NSString repitiendo otra cadena un número determinado de veces



objective-c cocoa (5)

El primer método anterior es para un solo personaje. Este es para una cadena de caracteres. Se podría usar también para un solo personaje pero tiene más sobrecarga.

+ (NSString*)stringWithRepeatString:(char*)characters times:(unsigned int)repetitions; { unsigned int stringLength = strlen(characters); unsigned int repeatStringLength = stringLength * repetitions + 1; char repeatString[repeatStringLength]; for (unsigned int i = 0; i < repetitions; i++) { unsigned int pointerPosition = i * repetitions; memcpy(repeatString + pointerPosition, characters, stringLength); } // Set terminating null repeatString[repeatStringLength - 1] = 0; return [NSString stringWithCString:repeatString]; }

Esto debería ser fácil, pero me está costando encontrar la solución más fácil.

Necesito un NSString que sea igual a otra cadena concatenada consigo mismo un determinado número de veces.

Para una mejor explicación, considere el siguiente ejemplo de python:

>> original = "abc" "abc" >> times = 2 2 >> result = original * times "abcabc"

¿Algún consejo?

EDITAR:

Iba a publicar una solución similar a la de Mike McMaster , después de ver esta implementación de OmniFrameworks:

// returns a string consisting of ''aLenght'' spaces + (NSString *)spacesOfLength:(unsigned int)aLength; { static NSMutableString *spaces = nil; static NSLock *spacesLock; static unsigned int spacesLength; if (!spaces) { spaces = [@" " mutableCopy]; spacesLength = [spaces length]; spacesLock = [[NSLock alloc] init]; } if (spacesLength < aLength) { [spacesLock lock]; while (spacesLength < aLength) { [spaces appendString:spaces]; spacesLength += spacesLength; } [spacesLock unlock]; } return [spaces substringToIndex:aLength]; }

Código reproducido del archivo:

Frameworks/OmniFoundation/OpenStepExtensions.subproj/NSString-OFExtensions.m

en el marco OpenExtensions de Omni Frameworks de The Omni Group .


Hay un método llamado stringByPaddingToLength:withString:startingAtIndex: ::

[@"" stringByPaddingToLength:100 withString: @"abc" startingAtIndex:0]

Tenga en cuenta que si quiere 3 abc''s, entonces use 9 ( 3 * [@"abc" length] ) o cree una categoría como esta:

@interface NSString (Repeat) - (NSString *)repeatTimes:(NSUInteger)times; @end @implementation NSString (Repeat) - (NSString *)repeatTimes:(NSUInteger)times { return [@"" stringByPaddingToLength:times * [self length] withString:self startingAtIndex:0]; } @end


Para el rendimiento, podrías caer en C con algo como esto:

+ (NSString*)stringWithRepeatCharacter:(char)character times:(unsigned int)repetitions; { char repeatString[repetitions + 1]; memset(repeatString, character, repetitions); // Set terminating null repeatString[repetitions] = 0; return [NSString stringWithCString:repeatString]; }

Esto podría escribirse como una extensión de categoría en la clase NSString. Probablemente haya algunos controles que deberían arrojarse allí, pero esta es la esencia de esto.


Si está utilizando Cocoa en Python, puede hacerlo, ya que PyObjC le NSString a NSString todas unicode capacidades de la clase unicode Python.

De lo contrario, hay dos formas.

Una es crear una matriz con la misma cadena en ella n veces, y usar componentsJoinedByString: Algo como esto:

NSMutableArray *repetitions = [NSMutableArray arrayWithCapacity:n]; for (NSUInteger i = 0UL; i < n; ++i) [repetitions addObject:inputString]; outputString = [repetitions componentsJoinedByString:@""];

La otra manera sería comenzar con un NSMutableString vacío y NSMutableString la cadena n veces, así:

NSMutableString *temp = [NSMutableString stringWithCapacity:[inputString length] * n]; for (NSUInteger i = 0UL; i < n; ++i) [temp appendString:inputString]; outputString = [NSString stringWithString:temp];

Puede cortar el stringWithString: llame si está bien que devuelva una cadena mutable aquí. De lo contrario, probablemente deba devolver una cadena inmutable, y el mensaje stringWithString: aquí significa que tiene dos copias de la cadena en la memoria.

Por lo tanto, recomiendo los componentsJoinedByString: solución.

[Editar: idea prestada para usar …WithCapacity: métodos de la respuesta de Mike McMaster .]


NSString *original = @"abc"; int times = 2; // Capacity does not limit the length, it''s just an initial capacity NSMutableString *result = [NSMutableString stringWithCapacity:[original length] * times]; int i; for (i = 0; i < times; i++) [result appendString:original]; NSLog(@"result: %@", result); // prints "abcabc"