这可能是最快的方法:
NSString *spacesWithLength(int nSpaces)
{
char UTF8Arr[nSpaces + 1];
memset(UTF8Arr, ' ', nSpaces * sizeof(*UTF8Arr));
UTF8Arr[nSpaces] = '\0';
return [NSString stringWithUTF8String:UTF8Arr];
}
你当前的代码无法工作的原因是,
+stringWithCharacters:
方法需要一个长度为12的数组,而你的数组只有一个字符长度
{' '}
。因此,为了解决这个问题,你必须为你的数组创建一个缓冲区(在这种情况下,我们使用char数组,而不是unichar数组,因为我们可以很容易地用memset设置char数组,但不能对unichar数组这样做)。
我提供的以上方法可能是动态长度最快的解决方案。如果你愿意使用GCC扩展,并且你有一个需要的固定大小空格的数组,你可以这样做:
NSString *spacesWithLength7()
{
unichar characters[] = { [0 ... 7] = ' ' };
return [NSString stringWithCharacters:characters length:7];
}
很不幸,该扩展不支持变量,所以它必须是一个常量。
通过GCC扩展和预处理器宏的魔力,我为您提供了... REPEATENATOR!只需传入一个字符串(或字符),它会完成剩下的事情!现在购买,仅售19.95美元,操作员正在等待接单!(基于@JeremyL建议的想法)
#define repeat(inp, cnt) __rep_func__(@encode(typeof(inp)), inp, cnt)
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];
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];
}