これはおそらく最速の方法です。
NSString *spacesWithLength(int nSpaces)
{
char UTF8Arr[nSpaces + 1];
memset(UTF8Arr, ' ', nSpaces * sizeof(*UTF8Arr));
UTF8Arr[nSpaces] = '\0';
return [NSString stringWithUTF8String:UTF8Arr];
}
現在のコードが機能しない理由+stringWithCharacters:
は、配列の長さが1文字しかないのに対し、長さが12文字の配列を想定しているためです{' '}
。したがって、修正するには、配列用のバッファを作成する必要があります(この場合、char配列は簡単に作成できますが、配列は使用できないため、char
ではなく配列を使用します)。unichar
memset
unichar
上で提供した方法は、動的な長さで可能な最速の方法です。GCC拡張機能を使用する意思があり、必要なスペースの固定サイズ配列がある場合は、次のように実行できます。
NSString *spacesWithLength7()
{
unichar characters[] = { [0 ... 7] = ' ' };
return [NSString stringWithCharacters:characters length:7];
}
残念ながら、その拡張機能は変数では機能しないため、定数である必要があります。
GCC拡張機能とプリプロセッサマクロの魔法を通して、私はあなたに与えます....リピーター!文字列(または文字)を渡すだけで、後はすべて実行されます。今すぐ購入、たったの19.95ドルで、オペレーターが待機しています!(@JeremyLによって提案されたアイデアに基づく)
// step 1: determine if char is a char or string, or NSString.
// step 2: repeat that char or string
// step 3: return that as a NSString
#define repeat(inp, cnt) __rep_func__(@encode(typeof(inp)), inp, cnt)
// arg list: (int siz, int / char *input, int n)
static inline NSString *__rep_func__(char *typ, ...)
{
const char *str = NULL;
int n;
{
va_list args;
va_start(args, typ);
if (typ[0] == 'i')
str = (const char []) { va_arg(args, int), '\0' };
else if (typ[0] == '@')
str = [va_arg(args, id) UTF8String];
else
str = va_arg(args, const char *);
n = va_arg(args, int);
va_end(args);
}
int len = strlen(str);
char outbuf[(len * n) + 1];
// now copy the content
for (int i = 0; i < n; i++) {
for (int j = 0; j < len; j++) {
outbuf[(i * len) + j] = str[j];
}
}
outbuf[(len * n)] = '\0';
return [NSString stringWithUTF8String:outbuf];
}