如何在Objective-C中将NSString逐个字符转换为NSArray

4

我希望将NSString(ex. @"HELLO")转换为NSArray(ex. [@"H", @"E", @"L", @"L", @"O", nil])

首先,我尝试使用componentsSeparatedByString, 但它需要指定分隔符,所以我无法使用。那该怎么办呢?

3个回答

7

将字符串拆分成数组的正确方法是按照以下步骤操作(作为一个NSString类别方法):

@interface NSString (ConvertToArray)
-(NSArray *)convertToArray;
@end

@implementation NSString (ConvertToArray)

- (NSArray *)convertToArray {
    NSMutableArray *arr = [[NSMutableArray alloc] init];
    NSUInteger i = 0;
    while (i < self.length) {
        NSRange range = [self rangeOfComposedCharacterSequenceAtIndex:i];
        NSString *chStr = [self substringWithRange:range];
        [arr addObject:chStr];
        i += range.length;
    }

    return arr;
}

@end

NSArray *array = [@"Hello " convertToArray];
NSLog(@"array = %@", array);

如果字符串包含Unicode字符\U10000或更高版本,那么硬编码范围长度为1的解决方案将失败。这包括Emoji字符以及许多其他字符。


1
快要完成了。但是国旗没有受到影响。 - Roman Truba

6

这是我的代码:

@interface NSString (ConvertToArray)
-(NSArray *)convertToArray;
@end

@implementation NSString (ConvertToArray)

-(NSArray *)convertToArray
{
    NSMutableArray *arr = [[NSMutableArray alloc]init];
    for (int i=0; i < self.length; i++) {
        NSString *tmp_str = [self substringWithRange:NSMakeRange(i, 1)];
        [arr addObject:[tmp_str stringByReplacingPercentEscapesUsingEncoding:NSUTF8StringEncoding]];
    }
    return arr;
}
@end

:

- (void)foo
{
    NSString *exString = @"HELLO";
    NSArray *arr = [exString convertToArray];
    for (NSString *str  in arr) {
        NSLog(@"%@\n",str);
    }
}

类别对我很友好。谢谢! - bekkou68
如果字符串包含任何Unicode值大于或等于\U10000的Unicode字符,则此解决方案将无法正常工作。例如,尝试使用各种Emoji字符。 - rmaddy
1
如果字符串包含任何区域指示符,则您的解决方案也不起作用。它们使用代理对。但是您的解决方案比我的更好。 - honami
同意。不幸的是,没有API可以帮助处理那些标志字符。 - rmaddy

2
NSString *string = @"HELLO";
NSMutableArray *array = [[NSMutableArray alloc] init];
for (int i = 0; i < string.length; i ++) {
    [array addObject:[NSString stringWithFormat:@"%c", [string characterAtIndex:i]]];
}

这在超出\UFFFF的Unicode字符上根本不起作用。而且%c格式说明符在\UFF之外也不起作用。 - rmaddy

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接