【问题标题】:How do you join an NSArray of [Number numberWithChar: c]'s into an NSString?如何将 [Number numberWithChar: c] 的 NSArray 加入到 NSString 中?
【发布时间】:2011-10-13 01:59:50
【问题描述】:

当我使用componentsJoinedByString 时,我只会得到一长串数字。

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

由于技术原因,字符仅存储为NSNumbers 而不是chars:genArray 接受一个块并调用该块 100 多次以填充 NSArray。块必须持有 ObjC 对象;不是原始类型。

所以问题仍然存在:如何将 [NSNumber numberWithChar: c] 的 NSArray 加入到 NSString 中?

【问题讨论】:

  • 发布更多 NSArray 元素和您的期望。
  • 您可能需要“手动”遍历数组并通过检查每个元素来构造字符串,而不是尝试使用 componentsJoinedByString: 之类的东西。

标签: objective-c join nsstring nsarray char


【解决方案1】:

componentsJoinedByString 将数组元素连接成一个字符串,它们之间有分隔符。使用description 方法将数组元素转换为字符串(如果还没有NSString"。如果您有n 个NSNumbers 数组,我希望得到一个有趣的结果。

【讨论】:

    【解决方案2】:

    为什么不用[NSString stringWithCharacters:c length:1] 填充您的数组?然后componentsJoinedByString: 应该可以工作。 (查看stringWithCharacters:length: 上的文档;以上仅用于说明。例如,您可能必须使用&c。)

    【讨论】:

      【解决方案3】:
      + (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;
      }
      

      【讨论】:

      • 这是一个好的开始,但我有几个问题。首先,你为什么用 NUL 字节预先填充数组?您将覆盖这些字节中的每一个。其次,您实际上并没有终止 NUL,因为您只填写了[arr count]。第三,如果你真的想填零,只需使用calloc() 而不是malloc()。第四,您假设所有字符都是
      • 根据我的经验,在为 cstring 分配空间时,通常会有随机数据设法滑过 NUL 字节,这可能是我 malloc() 事情有多糟糕的产物。但是你的技术点是正确的。 /facepalm 我什至没有把 NUL 放在它应该去的地方。由于 genChar 自动对超过 128 的随机整数取模,因此不会超过 127(参见 GitHub 上的代码)。
      【解决方案4】:
      + (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];
      }
      

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

      【讨论】:

      • 为什么使用 CFString 而不是 NSString?
      • 哦,抱歉,我忘记投了。 CFString 是 NSString。真的,我只是无法查找正确的 NSString 等效项。我现在将对其进行编辑以改用 NSString 方法。
      • @mcandre:好的,它现在使用 NSString。我还添加了我忘记的-autorelease。猜猜这就是我在浏览器中编写代码所得到的。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-04-27
      • 2011-09-28
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多