无法从Cocoa NSMutableString中删除换行符

时间:2010-01-23 06:01:06

标签: objective-c cocoa nsstring newline nsmutablestring

嘿,对于我的生活,这不起作用:..

NSMutableString *b64String = [[[NSMutableString alloc] initWithFormat:@"Basic %@", [string _base64Encoding:string]] autorelease];

    [b64String stringByTrimmingCharactersInSet:[NSCharacterSet newlineCharacterSet]];
    NSLog(@"(%@)", b64String);

    NSRange foundRange = [b64String rangeOfString:@"\n"];
    if (foundRange.location != NSNotFound)
        [b64String stringByReplacingOccurrencesOfString:@"\n"
                                            withString:@""
                                               options:0 
                                                 range:foundRange];
    NSLog(@"(%@)", b64String);

我在SO上找到的那些方法 - 它们似乎不起作用......我必须做一些非常错误的事情。但是,如果我打破NSLog,我可以清楚地看到字符串中的“\ n”(在调试器和控制台中)

此外,这是真的:

if (foundRange.location != NSNotFound)

我可以看看是否执行了stringByReplacingOccurencesOfString方法......

3 个答案:

答案 0 :(得分:4)

只需致电

b64String = [b64String stringByReplacingOccurrencesOfString:@"\n" withString:@""]

就足够了(请记住-release b64string不必要的副本。您可能希望将其存储到另一个变量中),或者使用实际的可变方法来实现全范围:

[b64String replaceOccurrencesOfString:@"\n" withString:@"" options:0 range:NSMakeRange(0, [b64String length])];

-stringByReplacingOccurrencesOfString:withString:options:range:中,range参数指定发生替换的范围。这意味着在范围之外不会有任何替代品。在您的代码中,您传递\n的第一个外观的范围。效果只会发生\n一次。

stringBy...方法用于不可变字符串。他们不会修改输入字符串。相反,它们会创建不可变字符串的副本并返回修改后的副本。

答案 1 :(得分:4)

这是因为方法stringByTrimmingCharactersInSet:返回一个新字符串而不是修改当前字符串。

NSString* trimmedString = [b64String stringByTrimmingCharactersInSet:[NSCharacterSet newlineCharacterSet]];

答案 2 :(得分:0)

您可以在NSMutableString就地修剪换行符,但需要使用Core Foundation中的CFStringTrim方法。

<强>目标-C:

NSMutableString *string = [NSMutableString stringWithString:@"\nfoo bar baz\n"];
CFStringTrim((__bridge CFMutableStringRef)string, (__bridge CFStringRef)@"\n");

<强>夫特:

let string = NSMutableString(string: "\nfoo bar baz\n")
CFStringTrim(string as CFMutableString, "\n" as CFString)