【问题标题】:Is there a simple way to split a NSString into an array of characters?有没有一种简单的方法可以将 NSString 拆分为字符数组?
【发布时间】:2013-02-21 15:19:26
【问题描述】:

有没有一种简单的方法可以将 NSString 拆分为字符数组?如果结果类型是 NSString 本身的集合,实际上最好是一个集合,每个只有一个字符。

是的,我知道我可以循环执行此操作,但我想知道是否有更快的方法来使用任何现有方法或函数来执行此操作,就像在 C# 中使用 LINQ 一样。

例如

// I have this...
 NSString * fooString = @"Hello";

// And want this...
NSArray * fooChars; // <-- Contains the NSStrings, @"H", @"e", @"l", @"l" and @"o"

【问题讨论】:

标签: objective-c nsstring nsarray


【解决方案1】:

试试这个

NSMutableArray *array = [NSMutableArray array];
NSString *str = @"Hello";
for (int i = 0; i < [str length]; i++) {
    NSString *ch = [str substringWithRange:NSMakeRange(i, 1)];
    [array addObject:ch];
}

【讨论】:

    【解决方案2】:

    你可以这样做(如果你想使用枚举器)

    NSString *fooString = @"Hello";
    NSMutableArray *characters = [[NSMutableArray alloc] initWithCapacity:[fooString length]]; 
    
    [fooString enumerateSubstringsInRange:NSMakeRange(0, fooString.length)
                                  options:NSStringEnumerationByComposedCharacterSequences
                               usingBlock:^(NSString *substring, NSRange substringRange, NSRange enclosingRange, BOOL *stop) {
        [characters addObject:substring];
    }];
    

    如果你真的想把它放在一个 NSArray 中

    NSArray *fooChars = [NSArray arrayWithArray:characters];
    

    【讨论】:

    • 谢谢!仍然习惯于阻塞,考虑到我对 C# 中的 lambda 和匿名方法有多熟悉,这很奇怪!
    • 只是一个细节:转换为NSArray* 不会转换数组,它只是转换指针,在这种情况下这是不必要的。如果你想创建一个不可变数组,你可以使用 arrayWithArray: 方便的方法,例如。
    • 或者,如果你想要一个快捷方式:NSArray *fooChars = characters.copy;
    【解决方案3】:

    请务必注意某些字符(如表情符号和其他字符)可能跨越的范围比一个索引更长。

    这是一个 NSString 的分类方法

    @implementation (SplitString)
    
    - (NSArray *)splitString
    {
        NSUInteger index = 0;
        NSMutableArray *array = [NSMutableArray arrayWithCapacity:self.length];
    
        while (index < self.length) {
            NSRange range = [self rangeOfComposedCharacterSequenceAtIndex:index];
            NSString *substring = [self substringWithRange:range];
            [array addObject:substring];
            index = range.location + range.length;
        }
    
        return array;
    }
    
    @end
    

    【讨论】:

    • 区域指标未作为标志加入
    【解决方案4】:

    将其转换为 NSData [data bytes] 将在您选择的编码中包含一个 C 字符串 [data length] 字节长。

    【讨论】:

    • 不,这不会给你一个字符数组。它为您提供了一个字节数组,表示您在将字符串转换为数据时使用的任何字符编码。要求的东西完全不同。
    猜你喜欢
    • 2020-02-16
    • 1970-01-01
    • 1970-01-01
    • 2020-10-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多