Objective c 如何加入[Number numberWithChar:c]';把它变成一个字符串?

Objective c 如何加入[Number numberWithChar:c]';把它变成一个字符串?,objective-c,join,nsstring,nsarray,char,Objective C,Join,Nsstring,Nsarray,Char,当我使用由字符串连接的组件时,我只得到一个长的数字字符串 编辑:我意识到这个任务令人困惑。如果有人想要NSString,他们到底为什么要用NSNumber填充NSArray?答案是我正在编写一个可扩展的单元测试框架。基本函数genNum、genBool和genChar分别生成具有随机int、BOOL和char值的nsnumber。然后是genArray,它使用指定的生成器生成一个随机数组。因此,要构造一个随机NSString,可以使用genChar生成器运行genArray,并将生成的NSArr

当我使用由字符串连接的组件时,我只得到一个长的数字字符串

编辑:我意识到这个任务令人困惑。如果有人想要NSString,他们到底为什么要用NSNumber填充NSArray?答案是我正在编写一个可扩展的单元测试框架。基本函数
genNum
genBool
genChar
分别生成具有随机int、BOOL和char值的nsnumber。然后是
genArray
,它使用指定的生成器生成一个随机数组。因此,要构造一个随机NSString,可以使用
genChar
生成器运行
genArray
,并将生成的NSArray转换为NSString

由于技术原因,
genArray
接受一个块并调用该块100多次以填充NSArray,因此字符仅存储为
NSNumber
s而不是
char
s。块必须包含ObjC对象;不是原始类型


因此问题仍然存在:如何将[NSNumber numberWithChar:c]的NSArray连接到NSString中?

组件通过字符串连接将数组元素连接到一个字符串中,并在它们之间使用分隔符。使用
description
方法将数组元素转换为字符串(如果尚未
NSString
)。如果您有n个
NSNumbers
数组,我希望得到一个有趣的结果。

为什么不使用
[NSString stringWithCharacters:c length:1]填充数组
?然后
组件通过字符串连接:
应该可以工作。(检查
stringWithCharacters:length:
;以上仅用于说明。例如,您可能必须使用
&c

+(NSString*)genString{
NSArray*arr=[self-genArray:^(){return[ObjCheck-genChar];}];
NSMutableString*s=[NSMutableString stringWithCapacity:[arr计数]];
int i;
对于(i=0;i<[arr计数];i++){
[s appendString:[NSString stringWithFormat:@“%c”,[[arr objectAtIndex:i]charValue]];
}
返回s;
}

此特定解决方案将假定chars>127应被视为unicode码点(这基本上意味着,对于字符大小的值,为ISO-8859-1)。它还避免在创建结果字符串时复制缓冲区。

发布更多NSArray元素和您期望的内容。您可能需要“手动”迭代数组"并通过检查每个元素来构造字符串,而不是尝试使用类似于
组件joinedbystring:
的东西。这是一个好的开始,但我有几个问题。首先,为什么要用NUL字节预填充数组?您只需覆盖这些字节中的每一个。其次,您实际上不是NUL terminating,因为你只填充了
[arr count]
。第三,如果你真的想零填充,只需使用
calloc()
而不是
malloc()
。第四,根据我的经验,您假设所有字符都是字符,在为cstring分配空间时,经常会有随机数据设法从NUL字节中滑过,这可能是我malloc()的缺陷事情。但是你的技术点是正确的。/facepalm我甚至没有在它应该去的地方放一个NUL。由于genChar自动模块化超过128的随机整数,没有一个会超过127(请参阅GitHub上的代码)。为什么要用CFString而不是NSString?哦,对不起,我忘了强制转换它。CFString是NSString。实际上,我就是没法找到正确的NSString等价物。我现在就编辑它,改用NSString方法。@mcandre:好的,它现在使用的是NSString。我还添加了我忘记的
-autorelease
。我猜这就是我得到的结果用于在浏览器中编写代码。
+ (NSString *) genString {
    NSArray* arr = [self genArray: ^() { return [ObjCheck genChar]; }];

    NSMutableString* s = [NSMutableString stringWithCapacity: [arr count]];

    int i;
    for (i = 0; i < [arr count]; i++) {
        [s appendString: [NSString stringWithFormat: @"%c", [[arr objectAtIndex: i] charValue]]];
    }

    return s;
}
+ (id)genString {
    NSArray *chars = [self genArray:^{ return [ObjCheck genChar]; }];

    if ([chars count] == 0) {
        return @"";
    }

    unichar *buffer = malloc(sizeof(unichar) * [chars count]);

    [chars enumerateObjectsUsingBlock:^(NSNumber *num, NSUInteger idx, BOOL *stop) {
        buffer[idx] = (unichar)[num charValue];
    }];

    return [[[NSString alloc] initWithCharactersNoCopy:buffer length:[chars count] freeWhenDone:YES] autorelease];
}